如何防止 UITapGestureRecognizer 捕捉每一个点击事件?

31

你好,我有一个OpenGL视图,并在其上有一个选项卡栏。我正在使用一个点击识别器在屏幕上点击不同的3D对象。在选项卡栏中,我有一个按钮,但它不起作用,因为点击识别器也会捕捉这些点击事件。我该如何解决这个问题?我已经尝试了以下方法:


- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
  if ([touch.view isKindOfClass:[UIBarButtonItem class]]) return FALSE;
  return TRUE;
}

我认为我在比较错误的类,因为当我调试时它总是返回TRUE。


3
您的 if 语句永远不会返回 false - 按钮不是视图... 但您可以通过在调试器中设置断点来检查不同的点击位置所获得的视图类型。 - Axel
哦,我刚注意到UIBarButtonItem不是一个UIView :) 谢谢。 - gyozo kudor
2个回答

33

或者您可以直接使用 [singleTap setCancelsTouchesInView:NO]。 示例:

UITapGestureRecognizer *singleTap = [
    [UITapGestureRecognizer alloc]
    initWithTarget: self
    action: @selector(yourSelector:)
];
[singleTap setCancelsTouchesInView:NO];
[[self view] addGestureRecognizer: singleTap];

1
在Interface Builder中也可作为“View”中的“Canceled”使用。太棒了! - Rudolf Adamkovič
唯一能起作用的方法,而且效果非常好,我要说!完全没有影响其他代码。谢谢! - StinkyCat

28
如果([touch.view.superview isKindOfClass:[UIToolbar class]])返回 FALSE;

这是我让它工作的方式。Superview 是一个 UIToolbar,可能是 UIBarButtonIttem ,在这之后是一个视图


这个方法在手势识别器的视图上进行命中测试失败时起作用。需要明确的是,我是在UITableView内部工作,手势的位置报告为{0,contentOffset - someConstant}。检查触摸的视图是一个好的解决方案。谢谢。 - Justin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接