Одновременные распознаватели жестов в Iphone SDK
Мне нужно поймать два разных жестов с использованием UISwipeGestureRecognizer
(например, UISwipeGestureRecognizerDirectionRight
и UISwipeGestureRecognizerDirectionLeft
). Когда я добавляю два разных распознавателя с помощью метода addGestureRecognizer, работает только последний добавленный распознаватель. Я прочитал, что мне нужно реализовать метод gestureRecognizer: shouldRecognizeSimultaneousWithGestureRecognizer: протокола UIGestureRecognizerDelegate
, но ничего не работает.
Может ли кто-нибудь помочь с простым примером ловли двух или более одинаковых жестов?
Спасибо!
Ответы
Ответ 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
.