web-dev-qa-db-ja.com

Iphone SDKの同時ジェスチャー認識機能

UISwipeGestureRecognizer(たとえば、UISwipeGestureRecognizerDirectionRightUISwipeGestureRecognizerDirectionLeft)を使用して、2つの異なるスワイプジェスチャーをキャッチする必要があります。 addGestureRecognizerメソッドを使用して2つの異なる認識機能を追加すると、最後に追加した認識機能のみが機能します。私はgestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:UIGestureRecognizerDelegateプロトコルのメソッドを実装する必要があることを読みましたが、何も機能しません。

誰かが2つ以上の同じジェスチャーをキャッチする簡単な例を手伝ってくれる?ありがとう!

25
user294890

それは本当に簡単でした:

最初に、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];

34
user294890

答え:フェニックスからの「えーと、ドキュメントをざっと見て」は絶対に機能しません。

彼はマスクを設定してから、同じ変数を使用して、認識エンジンがそれをクリアしてシングルビットを設定したかのようにテストしています。彼はドキュメントから正しく引用したように、それを保存します:

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

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];
20
ironmonkey

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

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

@property(nonatomic) UISwipeGestureRecognizerDirection direction

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

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

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

     }
}

はるかに単純で、対立する傾向がはるかに少ない。

2
Phoenix

ジェスチャレコグナイザがジェスチャを認識するために使用する手法について少しお読みになることをお勧めします。おそらく、最初の認識機能はジェスチャーを認識しようとしますが、ジェスチャーに応答する必要がないことに気付き、それから何らかの方法でジェスチャーを伝えません。

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

お役に立てれば。

1
Tomen

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

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

- (void)webViewDidFinishLoad:(UIWebView *)webView

0
rockfakie