26

UISwipeGestureRecognizer(たとえば、UISwipeGestureRecognizerDirectionRightと)を使用して、2 つの異なるスワイプ ジェスチャをキャッチする必要がありUISwipeGestureRecognizerDirectionLeftます。addGestureRecognizerメソッドを使用して 2 つの異なる認識エンジンを追加すると、最後に追加された認識エンジンのみが機能します。実装する必要があることを読んUIGestureRecognizerDelegate

2つ以上の同じジェスチャーをキャッチする簡単な例を誰か助けてもらえますか? ありがとう!

4

5 に答える 5

35

とても簡単でした:

UIGestureRecognizerDelegate最初に、プロトコルを実装するクラスを作成する必要があります。

@interface MyGestureDelegate : NSObject <UIGestureRecognizerDelegate>

@implementation MyGestureDelegate

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
    return YES;
}

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

そして、次のように使用します。


    UISwipeGestureRecognizer *swipeGestureLeft = [[UISwipeGestureRecognizer alloc]
                                              initWithTarget:self action:@selector(handleSwipeGestureLeft:)];
    [self.view addGestureRecognizer:swipeGestureLeft];
    swipeGestureLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    [swipeGestureLeft release];

    UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]
                                          initWithTarget:self action:@selector(handleSwipeGesture:)];
    swipeGesture.direction = UISwipeGestureRecognizerDirectionRight;
    [self.view addGestureRecognizer:swipeGesture];

    MyGestureDelegate *deleg = [[MyGestureDelegate alloc] init];

    [swipeGesture setDelegate:deleg];
    [swipeGesture release];

于 2010-04-13T10:30:07.973 に答える
20

Phoenix からの「ドキュメントをざっと見てみます...」という答えは絶対に機能しません。

彼はマスクを設定し、同じ変数を使用して、レコグナイザーがそれをクリアして単一のビットを設定したかのようにテストします。彼がドキュメントから正しく引用したように、それは保存されます:

スワイプの許可された方向

sender.direction

最初に設定したマスクを返すだけで、彼の例では、単一の方向に解決されることはありません!

UISwipeGestureRecognizerDirectionRight == 1
UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft == 3

さらに、ほとんどの場合、次のことは必要ありません。

  • デリゲートを設定する
  • 同時ジェスチャー認識を許可する (同時スワイプが必要な場合を除き、可能性は低い)
  • レコグナイザーをセレクターに送信する

以下は私にとってはうまくいきます:

   UISwipeGestureRecognizer* swipe;

   swipe = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeL)] autorelease];
   swipe.direction = UISwipeGestureRecognizerDirectionLeft;
   [view addGestureRecognizer:swipe];

   swipe = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeR)] autorelease];
   swipe.direction = UISwipeGestureRecognizerDirectionRight; // default
   [view addGestureRecognizer:swipe];
于 2010-07-23T15:06:58.760 に答える
2

ええと、ドキュメントをざっと見ると、必要以上に多くの作業を行っていることがわかります。

"方向スワイプの許可された方向。

@property(nonatomic) UISwipeGestureRecognizerDirection direction

UISwipeGestureRecognizerDirection説明ビットごとのORオペランドを使用して複数の定数を指定することにより、複数の方向を指定できます。デフォルトの方向はUISwipeGestureRecognizerDirectionRight。」

つまり、2つのUISwipeGestureRecognizersを使用する代わりに、次のことを実行できます。

UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]
                                      initWithTarget:self action:@selector(handleSwipeGesture:)];

 swipeGesture.direction = UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft;

そしてあなたの行動方法では:

  -(IBAction)handleSwipeGesture:(UISwipeGestureRecognizer*)sender
     {
     if (sender.direction == UISwipeGestureRecognizerDirectionLeft) {

         //do left action

     } else {

         //do right action

     }
}

はるかに単純で、競合する可能性がはるかに低くなります。

于 2010-06-24T02:38:57.997 に答える
1

ジェスチャ レコグナイザーがジェスチャを認識するために使用する手法について少し読むことをお勧めします。最初の認識者はジェスチャーを認識しようとしますが、それに反応する必要がないことに気づき、どういうわけかそれを伝えません。

それらの使用方法を理解するために、それらがどのように機能するかを読むことは非常に役に立ちます。

お役に立てれば。

于 2010-04-13T08:19:17.573 に答える
0

user294890 さんの提案のおかげで、リストされたUIGestureRecognizerDelegateメソッドから yes を返すことで成功しました。

ただし、Web ビューが読み込まれる前に GestureRecognizer を追加すると、機能しないことがわかりました。ただし、GestureRecognizer を webView デリゲート メソッドの webView に追加すると機能しました。

- (void)webViewDidFinishLoad:(UIWebView *)webView.

于 2012-07-11T03:09:34.743 に答える