collectionView手势与其它控件事件冲突问题

  • 解决的场景是:
    collectionView与外层View事件冲突,在外层View上添加了整体事件,然后在collectionView的协议方法didSelectItemAtIndexPath里也写了item的点击事件。
    会发现item的点击事件被屏蔽,只会响应外层View的手势事件。


    collectionView手势与其它控件事件冲突问题_第1张图片
    示意图.png

解决办法

1,遵守协议UIGestureRecognizerDelegate
2,给外层View添加手势,设置代理

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didClickView)]; 
tapGestureRecognizer.delegate = self;  
 [self.collectionview addGestureRecognizer:tapGestureRecognizer];

3,利用手势的代理方法进行判断,如果手势执行的视图不是需要的视图就不让其执行(这时点击item就会响应自身的方法)
主要用到的协议方法是shouldReceiveTouch

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
        if ([NSStringFromClass([touch.view class]) isEqualToString:@"_UITableViewHeaderFooterContentView"]) {
        return YES;
    }
    return NO;
}
  • 其中
    关于手势所在视图的判断,因写法(类引用格式)而异,可能有:
    touch.view != self.collectionView
    [[touch.view] isKindOfClass:[UIView class]]
    或者直接如上代码片断中判断:
    [NSStringFromClass([touch.view class]) isEqualToString:@"_UITableViewHeaderFooterContentView"]
    其中class名字可以从Xcode中的Debug View Hierarchy中查看。

你可能感兴趣的:(collectionView手势与其它控件事件冲突问题)