iOS,UIView点击时会穿透到父视图,而响应了父视图的方法,如何解决?

路飞
  • 223
- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    view.backgroundColor = [UIColor redColor];
    [self.view addSubview:view];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    NSLog(@"你点到我了");
}

我本来后续打算增加UITapGestureRecognizer给我的view整个点击事件,没想到父视图的touchesBegan方法被响应了。
我不想让我的view也响应touchesBegan这个方法,改如何解决呢?

回复
阅读 14.6k
5 个回答
AlanZhang
  • 2.5k
✓ 已被采纳

父视图的touchesBegan就是会被调到,因为确实到它触发的条件了。


更新:这里说的触发条件是指:
UIView中touchesXXX一系列的默认行为是把触摸事件向上传递。你的subview没有override这个默认行为,父视图自然会收到子视图传上来的消息,从而打印log。

所以下面删除线的做法又不太好了,不是你要的。你可以把subview的touches系列全部override,什么都不做就可以使父视图的touchesbegan不再被调用。

参考资料:UIResponder Class Reference touchesBegan:withEvent:


要么父视图的点击事件你也用tapGestureRecognizer实现,就可以把touchesXXX一系列的全去掉不用自己管理了,眼不见心不烦。

不然你就在父视图的touchesBegan里判断触摸点的位置是不是在subview里,是就不管,不是就"你点到我了"。

关于@loveuqian说的hit testing的一篇收藏http://smnh.me/hit-testing-in-ios/

应该不是子视图响应的。UIView默认用户交互开启,又没有添加事件,所以touch事件穿透了由父视图响应。给子视图添加事件试试。

571976808
  • 1
新手上路,请多包涵

你把UIview与用户的交互打开了,看下行不行

关键词应该是 hitTest

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏