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

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

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

25
задан Paras Joshi 9 May 2013 в 07:29
поделиться

4 ответа

Все оказалось очень просто:

Сначала нужно создать класс, реализующий протокол 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
ответ дан 28 November 2019 в 20:33
поделиться

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

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

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

1
ответ дан 28 November 2019 в 20:33
поделиться

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

"направление Разрешенные направления движения.

@property(nonatomic) UISwipeGestureRecognizerDirection direction

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

То есть, вместо использования двух 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
ответ дан 28 November 2019 в 20:33
поделиться

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

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

Разрешенные направления движения

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
ответ дан 28 November 2019 в 20:33
поделиться