美文网首页程序员
如何让子view 不受父view 手势事件的影响

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

作者: 攻城狮V | 来源:发表于2018-02-27 14:03 被阅读0次
    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 添加代理<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];
       
    }
    

    相关文章

      网友评论

        本文标题:如何让子view 不受父view 手势事件的影响

        本文链接:https://www.haomeiwen.com/subject/ovvpxftx.html