Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Сначала мы должны создать класс, реализующий протокол 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];

Ответ 2

Ответ: "Ум, быстрый взгляд на документацию..." из Феникса абсолютно не сработает!

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

Разрешенные направления прокрутки

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

Ответ 3

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

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

@property(nonatomic) UISwipeGestureRecognizerDirection direction

Обсуждение Вы можете указать несколько направлений, указав несколько констант UISwipeGestureRecognizerDirection, используя побитовые OR-операнды. По умолчанию используется значение 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

     }
}

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

Ответ 4

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

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

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

Ответ 5

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

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

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