iOS 屏蔽父 View 的点击手势

新建一个 父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 的响应事件
  1. 可以通过设置点击手势的代理方法,确定父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;
}
  1. 对于布局简单的父控件与子控件,可以设置父控件的点击手势的响应区域

你可能感兴趣的:(iOS 屏蔽父 View 的点击手势)