UITableViewCell中嵌套UICollectionView,UITableViewCell点击事件不响应处理

3,322 阅读1分钟
如下图所示,UI使用了一个UITableviw,UITableViewCell中又嵌套了UICollectionView


问题:

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

原因分析:

首先分析事件响应链:当手指触摸屏幕时,UIKit 就会产生一个事件(UIEvent)对象,并把它添加到事件队列中,然后由 UIApplication 从事件队列中取出首先分发给 UIWindow,从 UIWindow 开始进行分发,分发是依靠 UIView 的两个分类方法 hitTest:withEvent: & pointInside:withEvent: 以及 UIView 的 userInteractionEnabled、hidden、alpha 属性来进行的。在点击TableViewCell中的其他地方时,事件首先传递到UITableviewcell,然后依次传递给UICollectionView、UICollectionViewCell或者UICollectionReusableView,以至于最后点击没反应。响应链如下图:


解决方法:

截获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 *view = [super hitTest:point withEvent:event];


if ([view isKindOfClass:[UICollectionView class]] ||

[view isKindOfClass:[HGOrderListMoreGoodsCollectionCell class]]) {

return self;

}

return view;

}