- superView 添加了点击手势事件,这个时候subView 往往也默认携带了superView的点击手势事件,如果要在点击subView的时候,不受绑定事件的影响,可用如下方法:
-(void)tapGestureRead:(UITapGestureRecognizer *)sender
{
if( CGRectContainsPoint([sender.view viewWithTag:100].frame, [sender locationInView:self.alertBac])) {
//判断点击的地方是否在subView上,其中 [sender.view viewWithTag:100].frame 即使subView的frame 。[sender locationInView:self.alertBac]是点击的范围
NSLog(@"subView被点击");
}
else{
[self.alertBac removeFromSuperview];
};
}
注意:以上的方法有可能把subView的点击事件也给屏蔽了
如果subView也有点击事件要处理,又不想被屏蔽,可以采用以下方法 (给superView的手势添加代理):
- 先在viewcontroller 添加代理
<UIGestureRecognizerDelegate>
UITapGestureRecognizer *tagGestureRead = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureRead:)];
tagGestureRead.delegate = self;
[self.alertBac addGestureRecognizer:tagGestureRead];
- 然后实现代理方法,并在代理方法里进行区分判断
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
// 若为UITableViewCellContentView(即点击了tableViewCell),则不截获Touch事件
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
return NO;//禁止被绑定的方法冲突
}
return YES;//继续往下执行
}
- 代码优先执行上面的代理方法,然后决定是否执行以下的绑定的手势方法。 这样就不会冲突掉subView上的点击事件了
-(void)tapGestureRead:(UITapGestureRecognizer *)sender{
[self.alertBac removeFromSuperview];
}