UITapGestureRecognizer不会调用它的目标操作方法
问题描述:
出于某种原因,当我点击一个UIButton时,我的UITapGestureRecognizer
未调用它的方法。真奇怪的是我在Xcode中使用断点来确保gestureRecognizer:shouldReceiveTouch:
方法返回YES。手势应该称之为方法,但事实并非如此。我有cancelsTouchesInView
设置为YES,但它似乎没有做任何事情。UITapGestureRecognizer不会调用它的目标操作方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([touch.view isKindOfClass: [UIButton class]] && !editingTaskName)
return NO;
else if ([touch.view isKindOfClass: [UITextField class]])
return NO;
return YES; // handle the touch
}
下面是我设置所有手势识别器的代码。也许其他人正在干扰我的轻拍手势。
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget: self action: @selector(longPress:)];
[longPress setMinimumPressDuration: 0.3];
[longPress setDelaysTouchesBegan: YES];
[self setLongPressGesture: longPress];
[[self tableView] addGestureRecognizer: longPress];
UITapGestureRecognizer *backToTableView = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(backTapRecognized:)];
[backToTableView setCancelsTouchesInView: YES];
[backToTableView setDelegate: self];
[backToTableView setEnabled: NO];
[self setBackTapGesture: backToTableView];
[[self tableView] addGestureRecognizer: backToTableView];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(hideShowEditing:)];
[tap setCancelsTouchesInView: YES];
[tap setDelegate: self];
[self setEditTap: tap];
[[self tableView] addGestureRecognizer: tap];
答
一个按钮有它自己的可定位性,所以在按钮和手势识别器之间有冲突。在iOS 6中,按钮获胜;手势识别器因此被阻止识别。
在iOS 6中,有一个UIView gestureRecognizerShouldBegin:
方法。 UIButton返回NO(这是内置的),所以这是冲突的结果。
这需要比您的gestureRecognizer:shouldReceiveTouch:
更高的优先级。
答
尝试设置UITapGestureRecognizer的numberOfTapsRequired属性。像这样的东西应该足够了:
tap.numberOfTapsRequired = 1;
最大
所以,如果我想从具有优先停止的UIButton,我将不得不继承的UIButton并覆盖'gestureRecognizerShouldBegin:'方法。 – bbraunj 2013-05-11 02:47:10
将按钮手势识别器附加到按钮本身会更简单。然后那个轻击手势识别器就会赢。但是,这种杀死按钮自己的水龙头;为什么不直接使用按钮的内置动作消息并让按钮按照想要的方式工作? – matt 2013-05-11 02:55:34