UITableViewCell中嵌套UICollectionView中点击事件处理

如下图所示,布局时用了一个UITableviw,UITableViewCell中又嵌套UICollectionView:


image.png

问题:

在点击的时候发觉只响应了UICollectionViewCell,点击其他地方的时候,没有响应UITableViewCell的点击事件。

为什么会出现这种现象了?这就与事件响应链有关。

首先来看看事件响应链:当手指触摸屏幕时,UIKit 就会产生一个事件(UIEvent)对象,并把它添加到事件队列中,然后由 UIApplication 从事件队列中取出首先分发给 UIWindow,从 UIWindow 开始进行分发,分发是依靠 UIView 的两个分类方法 hitTest:withEvent: & pointInside:withEvent: 以及 UIView 的 userInteractionEnabled、hidden、alpha 属性来进行的。

所以在点击TableViewCell中的其他地方时,事件首先传递到UITableviewcell,之后依次传递给UICollectionView、UICollectionViewCell或者UICollectionReusableView,以至于最后点击没反应。如下图:


image.png

具体解决方法:截获UITableViewCell的事件。在UITableViewCell中实现下面方法,判断点击的位置是在UICollectionView上时,就return self(即返回UITableViewCell)告诉系统,该事件由UITableViewCell处理,就响应UITableViewCell的点击事件。上代码:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    // 如果不可以交互 | 隐藏 | 透明度太小 3者任意一个都忽略不能点击
    if(!self.userInteractionEnabled || self.hidden || self.alpha<=0.01){
        return nil;
    }
    
    UIView *v = [super hitTest:point withEvent:event];

    if ([v isKindOfClass:[UICollectionView class]] ||
        [v.superview isKindOfClass:[XNNearShopHeadCollectionReusableView class]] ||
        [v isKindOfClass:[XNNearShopCollectionViewCell class]]) {
        return self;
    }
    return v;
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 重点参考链接: View Programming Guide for iOS https://developer....
    Kevin_Junbaozi阅读 4,767评论 0赞 15
  • 7、不使用IB是,下面这样做有什么问题? 6、请说说Layer和View的关系,以及你是如何使用它们的。 1.首先...
    AlanGe阅读 1,002评论 0赞 1
  • 在iOS开发中经常会涉及到触摸事件。本想自己总结一下,但是遇到了这篇文章,感觉总结的已经很到位,特此转载。作者:L...
    WQ_UESTC阅读 6,277评论 4赞 26
  • 本文主要讲解iOS触摸事件的一系列机制,涉及的问题大致包括: 触摸事件由触屏生成后如何传递到当前应用? 应用接收触...
    baihualinxin阅读 1,313评论 0赞 9
  • 地上有花瓣。捡起来,好香啊!不由得凑近了鼻子,再闻一闻。 叫什么名字?不知道。只知道是树上落下来的。 “我们做香包...
    梅心无影阅读 426评论 3赞 1

友情链接更多精彩内容