UITapGestureRecognizer点击self.view,但忽略子视图

我需要实现一个function,当我双击self.view( UIViewCotroller视图)时,将调用一些代码。 但问题是,我有这个视图上的其他UI对象,我不想附加任何识别器对象的所有。 我发现这个方法下面如何做出我的看法的手势,我知道它是如何工作的。 现在我在障碍面前select创build这个识别器忽略子视图的方式。 有任何想法吗? 谢谢。

 UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)]; [doubleTap setNumberOfTapsRequired:2]; [self.view addGestureRecognizer:doubleTap]; 

你应该在self对象中采用UIGestureRecognizerDelegate协议,并调用下面的方法来检查视图。 在这个方法里面,检查一下你的视图,然后返回合适的bool(是/否)。 像这样的东西:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isDescendantOfView:yourSubView]) { return NO; } return YES; } 

编辑:请检查@伊恩的答案!

另一种方法是比较触摸的视图是否是手势视图,因为后代不会通过该条件。 一个不错的,简单的单行:

 func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { return touch.view == gestureRecognizer.view } 

而对于Swift变种:

 func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { if touch.view.isDescendantOfView(yourSubView){ return false } return true } 

isDescendantOfView是, isDescendantOfView返回一个Boolean值,指示接收者是给定视图的子视图还是与该视图相同。

完整的快速解决scheme(委托必须实现并设置为识别器):

 class MyViewController: UIViewController UIGestureRecognizerDelegate { override func viewDidLoad() { let doubleTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(onBaseTapOnly)) doubleTapRecognizer.numberOfTapsRequired = 2 doubleTapRecognizer.delegate = self self.view.addGestureRecognizer(doubleTapRecognizer) } func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { if touch.view.isDescendantOfView(self.view){ return false } return true } func onBaseTapOnly(sender: UITapGestureRecognizer) { if sender.state == .Ended { //react to tap } } } 

请注意, gestureRecognizer API已更改为:

gestureRecognizer(_:shouldReceive 🙂

请特别注意第一个参数的外部标签的下划线(跳过)指示符。

使用上面提供的许多例子,我没有收到这个事件。 下面是一个适用于当前版本的Swift(3+)的例子。

 public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { var shouldReceive = false if let clickedView = touch.view { if clickedView == self.view { shouldReceive = true; } } return shouldReceive }