iOS 手势冲突

作者: 阶梯 | 来源:发表于2017-04-11 15:03 被阅读1855次

    一 : view添加手势与tableView冲突问题

    ** 问题: ** 在UIView界面中的部分区域添加tableView,tableViewCell能正常点击,但是对该view添加点击手势,界面只识别点击手势,而不能正常操作tableViewCell

    抽屉效果.png

    解决方法:

        1. 遵守代理协议
        UIGestureRecognizerDelegate
    
        2. 给手势设置代理
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(respondsToTapGesture:)];
        tap.delegate = self;
        [self.view addGestureRecognizer:tap];
    
        3.实现代理方法
     - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
        // 点击的view的类名
        NSLog(@"%@", NSStringFromClass([touch.view class]));
        // 点击了tableViewCell,view的类名为UITableViewCellContentView,则不接收Touch点击事件
        if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
            return NO;
        }
        return  YES;
    }
    

    二 : view添加手势和collectionView的冲突问题

    想要的效果 : 既触发didSelectItemAtIndexPath方法,又能在CollectionView自身上处理TapGesture

    问题 : collectionView没有内容视图, 不能像上面那样解决冲突

    解决方法 :

    1. 遵守代理协议
    UIGestureRecognizerDelegate
    
    2. 给手势设置代理
    UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cancelDelete)]; 
    apGestureRecognizer.delegate = self;  [注意点]
     [self.collectionview addGestureRecognizer:tapGestureRecognizer];
    
    3. self要实现UIGestureRecognizerDelegate协议,其中就有gestureRecognizer:shouldReceiveTouch:方法 
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
        if (touch.view != self.collectionView) {
            return NO;
        }else {
            return YES;
        }
    }
    

    借鉴 : http://bbs.csdn.net/topics/391010780

    相关文章

      网友评论

        本文标题:iOS 手势冲突

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