0

UIScrollView 内に UIView があり、どちらも IB を使用して作成されています。UIView は、UIScrollView 内で水平にスクロールします。左右の 2 本指スワイプを検出したい。

SmpleGestureRecognizersで見つけたサンプル コードを借用して 、UIScrollView の ViewController の viewDidLoad メソッドに次のコードを追加しました...

UIGestureRecognizer *recognizer;
UISwipeGestureRecognizer *swipeRightRecognizer, *swipeLeftRecognizer;

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
swipeRightRecognizer = (UISwipeGestureRecognizer *)recognizer;
swipeRightRecognizer.numberOfTouchesRequired = 2;
[self.view addGestureRecognizer:swipeRightRecognizer];
[recognizer release];

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
swipeLeftRecognizer = (UISwipeGestureRecognizer *)recognizer;
swipeLeftRecognizer.numberOfTouchesRequired = 2;
swipeLeftRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:swipeLeftRecognizer];
[recognizer release];

私はviewcontroller.hに設定しました。次のデリゲートメソッドがあります...

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
   return YES;
}

これは有効なgestureRecognizerデリゲートメソッドであると想定していますが、ドキュメントでそれへの参照を見つけることができません.

エラーは発生しませんが、2 本の指でスワイプしても何も起こりません。デリゲート メソッドは呼び出されず、アクション メソッドも呼び出されません。numbeOfTouchesRequired 呼び出しを削除して、1 本の指でスワイプしても無駄になるかどうかを確認してみました。

正しいビューにgestureRecognizersを追加していますか? UIView、UIScrollView、およびself.view.superViewに追加してみました。

サンプルコードはうまく動作します。コードの実装とサンプル コードの唯一の違いは、ビューの作成に IB を使用し、サンプル コードでは使用しなかったことです。レコグナイザーに到達する前に、何かがスワイプ ジェスチャを消費していると思われます。

私は何を間違っていますか。

ありがとう、

ジョン

4

3 に答える 3

7

同じ問題があり、UISwipeGestureRecognizer の代わりに UIPanGestureRecognizer を使用して解決しました。

スワイプの検出をエミュレートするために、スクロールビューでジェスチャーの速度を試します。x 方向の速度 >= 3000 (たとえば) の場合、スワイプが検出されます。

x>0 の場合、右スワイプになります。

あなたの状況を解決するために私が実装したコードは次のとおりです: _scroll1 という名前の uiscrollview:

UIPanGestureRecognizer *pan;
pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(Swipe4ScrollViews:)];
[pan setMinimumNumberOfTouches:2];
[_scroll1 addGestureRecognizer:pan];
[pan release];

_panning という名前のグローバル BOOL 変数を使用すると、Swipe4ScrollViews は大変な作業を行います。

-(void)Swipe4ScrollViews:(UIPanGestureRecognizer *)sender 
{
    if(sender.state == UIGestureRecognizerStateBegan) _panning = NO;

    CGPoint v =[sender velocityInView:_scroll1];

    NSLog(@"%f, %f",v.x,v.y);

    if( (abs(v.x) >= UMBRAL) && !_panning)
    {
        _panning = YES;
        [sender cancelsTouchesInView];

        if(v.x>0) NSLog(@"Right");
        else NSLog(@"Left");

        [self doSomething];
    }
}

UIGestureRecognizer サブクラスにカプセル化しました: UISwipe4ScrollGestureRecognizer

于 2011-08-04T07:24:01.867 に答える
1

サンプルコードとコードの最大の違いは、コードにが含まれていることUIScrollViewです。

内部的には、スクロールビュー、テーブルビュー、およびWebビューはすべて、ある程度ジェスチャレコグナイザーを使用します。これらのビュー内でジェスチャ(内部ですでにサポートされているジェスチャと同様のジェスチャ)を受け取ることを期待している場合、それらに到達する前に、ほぼ確実に消費されるか、大幅に遅延します。ユースケースでサポートされている場合は、これらのビューの外側またはでジェスチャを受信すると正常に機能するはずです。

于 2010-12-10T09:15:16.247 に答える
1

UIScrollView の delayContentTouches-property を NO に設定してみてください。

于 2011-01-11T17:40:34.063 に答える