新建一个 父view:A ,并且在这个 父view(A) 上添加点击事件:tap;然后在 父view 上再添加子 view:(B).这时候点击B的时候也会响应A 的点击事件
- 如果 子 view B 默认是关闭用户交互状态
当 B 是类似于 UIImageView 这种默认关闭用户交互的控件,这时候点击 B 是不会有反应的.如果为 B 添加另一个点击手势:tap2.
// preView
UIView *preView = [UIView new];
UITapGestureRecognizer *tap1 = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapView)];
[preView addGestureRecognizer:tap1];
UIImageView *imgView = [UIImageView new ];
[preView addsubview:imgView];
// 开启 imgView 的手势交互
imgView.userInteractionEnabled = YES;
// 然后imgView 添加点击手势 tap2,这时候 tap1 和 tap2是不会产生干扰的
- 但是,更普遍的情况是:当子 view B 也会自动响应父 view 的响应事件
- 可以通过设置点击手势的代理方法,确定父view上的点击手势什么时候响应
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapView)];
tap.delegate = self;
[self addGestureRecognizer:tap];
// tap 的代理方法
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
if ([touch.view isDescendantOfView:self.tbView]) {
return NO;
}
if ([touch.view isKindOfClass:[UITextField class]]){
return NO;
}
// 若为UITableViewCellContentView(即点击了tableViewCell),则不截获Touch事件
// NSLog(NSStringFromClass([touch.view class]));
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
return NO;
}
return YES;
}
- 对于布局简单的父控件与子控件,可以设置父控件的点击手势的响应区域