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

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


    示意图.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中查看。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,032评论 3 119
  • 一、Designing Your Data Source and Delegate Every collectio...
    零点知晨阅读 442评论 0 0
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,676评论 25 709
  • 前些日子看到的一篇文章,说是很多都市的所谓小白领(加一个“小”为定语,没有任何歧视的意思,只是说他们年轻而已),在...
    杨仲凯律师阅读 1,462评论 0 3
  • 月朗星稀, 闲愁独清寂, 举杯邀月品花殇, 一曲流连无际。 几多风雨砥砺, 几多往事回忆。 一曲高山流水, 知音何...
    琴痴1102阅读 238评论 6 5