问题:
在点击的时候发觉只响应了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;
}