iOS:从顶视图到底视图拦截点击手势事件

Posted

技术标签:

【中文标题】iOS:从顶视图到底视图拦截点击手势事件【英文标题】:iOS: Intercept tap gesture event from top view to bottom view 【发布时间】:2014-12-27 02:06:27 【问题描述】:

在我的视图控制器中,我将一个 UITapGestureRecognizer 添加到 self.view。我在 self.view 上添加了一个小视图。当我点击小视图时,我不想触发 self.view 中的 UITapGestureRecognizer 事件。这是我的代码,它不起作用。

    - (void)viewDidLoad 
    [super viewDidLoad];

    UITapGestureRecognizer *_tapOnVideoRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(toggleControlsVisible)];

    [self.view addGestureRecognizer:_tapOnVideoRecognizer];

    UIView *smallView=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
    smallView.backgroundColor=[UIColor redColor];
    smallView.exclusiveTouch=YES;
    smallView.userInteractionEnabled=YES;

    [self.view addSubview:smallView];
    

    - (void)toggleControlsVisible
    
        NSLog(@"tapped");
    

当我点击小视图时,它仍然会触发 self.view 中的点击事件。 Xcode 日志“被窃听”。如何拦截smallView到self.view的手势事件?

【问题讨论】:

【参考方案1】:

像这样实现UIGestureRecognizer委托方法shouldReceiveTouch。如果触摸位置在 topView 内部,则不接收触摸。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

    CGPoint location = [touch locationInView:self.view];

    if (CGRectContainsPoint(self.topView.frame, location)) 
        return NO;
    
   return YES;

【讨论】:

谢谢。这很好用。但是为什么smallView不能像UIButton一样拦截点击事件呢? @nimingzhe2008 您需要在smallView 中添加一个UITapGestureRecognizer 才能做到这一点。 (区别在于UIButtons 天生就有一个UITapGestureRecognizer 内置。)但是gabbler 的解决方案要干净得多。 它像 Lyndsey Scott 提到的那样工作,并且: 只有在同一窗口中没有其他视图与之关联的触摸时,exclusiveTouch 视图才会接收触摸;一旦一个 ExclusiveTouch 视图接收到触摸,则当该触摸存在时,同一窗口中的其他视图不会接收任何触摸。

以上是关于iOS:从顶视图到底视图拦截点击手势事件的主要内容,如果未能解决你的问题,请参考以下文章

UIGestureRecongnizer 手势拦截

iOS 应用程序在点击手势事件时崩溃

iOS - 在图像视图上点击手势问题

手势事件

iOS Swift - 使点击手势识别器在视图下工作

如何在父视图中禁用点击手势?