Я должен поймать два других использования жестов сильного удара UISwipeGestureRecognizer
(например, UISwipeGestureRecognizerDirectionRight
и UISwipeGestureRecognizerDirectionLeft
). Когда я добавляю два различных устройства распознавания с addGestureRecognizer методом, только в последний раз добавленные работы устройства распознавания. Я считал, что должен реализовать gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: метод UIGestureRecognizerDelegate
протокол, но ничто не работает.
Кто-либо может помочь с простым примером ловли двух или больше тех же жестов?Спасибо!
Все оказалось очень просто:
Сначала нужно создать класс, реализующий протокол 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];
Я бы посоветовал вам немного прочитать о технике, которую распознаватели жестов используют для распознавания жеста. Я предполагаю, что первый распознаватель пытается распознать жест, но понимает, что ему не нужно на него реагировать, и затем почему-то не передает его дальше.
Очень полезно прочитать, как они работают, чтобы понять, как их использовать.
Надеюсь, это поможет.
Быстрый взгляд на документацию показывает, что вы делаете гораздо больше работы, чем нужно:
"направление Разрешенные направления движения.
@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
}
}
Гораздо проще, и гораздо менее склонны к конфликтам.
Ответ: "Гм, беглость документацию ..." от Феникса категорически не выйдет!
Он устанавливает маску, а затем использует ту же переменную для проверки, как если бы распознаватель очистил ее и установил единственный бит. Он сохраняет, как он правильно процитировал из документации:
Разрешенные направления движения
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];