美文网首页iOS经验总结
UITableViewCell中嵌套UICollectionVi

UITableViewCell中嵌套UICollectionVi

作者: 114105lijia | 来源:发表于2020-03-24 09:57 被阅读0次

    如下图所示,布局时用了一个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;
    }
    

    相关文章

      网友评论

        本文标题:UITableViewCell中嵌套UICollectionVi

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