如何让子view 不受父view 手势事件的影响

  1. 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 添加代理
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];
   
}

你可能感兴趣的:(如何让子view 不受父view 手势事件的影响)