- (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这个方法,改如何解决呢?
父视图的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/