Одновременные распознаватели жестов в Iphone SDK

Мне нужно поймать два разных жестов с использованием UISwipeGestureRecognizer (например, UISwipeGestureRecognizerDirectionRight и UISwipeGestureRecognizerDirectionLeft ). Когда я добавляю два разных распознавателя с методом addGestureRecognizer , работает только последний добавленный распознаватель. Я прочитал, что мне нужно реализовать gestureRecognizer: shouldRecognizeSimultaneousWithGestureRecognizer: метод протокола UIGestureRecognizerDelegate , но ничего не работает.

Может ли кто-нибудь помочь с простым примером ловли двух или более же жестов? Благодаря!

Это было очень просто:

Сначала мы должны создать class, который реализует протокол UIGestureRecognizerDelegate :

 @interface MyGestureDelegate : NSObject  
@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; }
@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]; 

Ответ: «Хм, быстрый взгляд на документацию …» из Феникса абсолютно не сработает!

Он устанавливает маску, а затем использует ту же переменную для проверки, как если бы распознаватель очистил ее и установил один бит. Он хранит, как он правильно цитировал из документации:

Разрешенные направления салфетки

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

Гм, быстрый взгляд на документацию покажет, что вы делаете больше работы, чем вам нужно:

“направление Разрешенные направления салфетки.

 @property(nonatomic) UISwipeGestureRecognizerDirection direction 

Обсуждение Вы можете указать несколько направлений, указав несколько констант UISwipeGestureRecognizerDirection с помощью операндов поразрядного ИЛИ. По умолчанию используется UISwipeGestureRecognizerDirectionRight . ”

То есть вместо использования двух 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 } } 

Гораздо проще и гораздо меньше подвержены конфликтам.

Я бы посоветовал вам немного почитать о методе, который распознаватели жестов используют, чтобы распознать жест. Полагаю, первый распознаватель пытается распознать жест, но понимает, что ему не нужно реагировать на него, а затем почему-то не передает его.

Очень полезно прочитать, как они работают, чтобы понять, как их использовать.

Надеюсь это поможет.

Благодаря предложению user294890, я был успешным, вернув да из перечисленных методов UIGestureRecognizerDelegate .

Однако я обнаружил, что это не сработает, когда я добавляю GestureRecognizer перед загрузкой веб-представления. Однако он работал, когда я добавил GestureRecognizer в webView в методе делегата webView:

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

Interesting Posts
Давайте будем гением компьютера.