这是视图结构:
外部视图是UITableView
。
在UITableViewCell
内,有一个UICollectionView
。请注意,集合视图单元格之间存在一些黑色间距。
当我点击UICollectionView中的间距时,我希望触摸事件传递给UITableViewCell
。
答案 0 :(得分:11)
@tounaobun的优秀答案。经过测试,它按预期工作:
1)如果你点击集合视图中不是项目的任何地方,那么下面的表格单元格将选择正常。
2)如果你点击集合视图中的项目,那么表格单元格将不会选择,你可以正常地与集合视图交互(也就是说,滚动,调用didSelectItem等)
我转为swift作为参考:
斯威夫特3:
class TableCellCollectionView: UICollectionView {
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if let hitView = super.hitTest(point, with: event) {
if hitView is TableCellCollectionView {
return nil
} else {
return hitView
}
} else {
return nil
}
}
只需将此类定义添加到您的代码中(我将它放在实用程序文件中),然后将集合视图的类从UICollectionView更改为TableCellCollectionView,您应该全部设置。
答案 1 :(得分:6)
google之后,我找到了一个解决方案。只需继承UICollectionView
类并覆盖hitTest:withEvent
方法。
<强> CustomCollectionView.h 强>
@interface CustomCollectionView : UICollectionView
@end
<强> CustomCollectionView.m 强>
@implementation CustomCollectionView
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *hitView = [super hitTest:point withEvent:event];
if ([hitView isKindOfClass:[self class]]) {
// If it is class UICollectionView,just return nil.
return nil;
}
// else return super implementation.
return [super hitTest:point withEvent:event];
}
@end
答案 2 :(得分:2)
最高投票答案的代码可以轻松缩短。
Swift 4.1:
final class InteractiveCollectionView: UICollectionView {
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
return super.hitTest(point, with: event) as? InteractiveCollectionView
}
}
答案 3 :(得分:0)
是否可以将collectionView的backgroundView UserInteraction设置为不启用,但请确保collectionViewCell已执行,以便它可以将tapEvent传递给下一个响应者。
- (void)viewDidLoad {
theCollectionView.userInteractionEnabled = NO;
}
我希望它会有所帮助。
答案 4 :(得分:0)
您可以覆盖point(inside:with:)
的{{1}}方法,并手动检查是否有任何单元格包含指定的点:
UICollectionView