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
才能做到这一点。 (区别在于UIButton
s 天生就有一个UITapGestureRecognizer
内置。)但是gabbler 的解决方案要干净得多。
它像 Lyndsey Scott 提到的那样工作,并且: 只有在同一窗口中没有其他视图与之关联的触摸时,exclusiveTouch 视图才会接收触摸;一旦一个 ExclusiveTouch 视图接收到触摸,则当该触摸存在时,同一窗口中的其他视图不会接收任何触摸。以上是关于iOS:从顶视图到底视图拦截点击手势事件的主要内容,如果未能解决你的问题,请参考以下文章