如何让UICollectionView的背景视图将点击事件透传给下层按钮
解决UICollectionView背景点击透传的方案
你之前尝试的设置背景透明、单独禁用背景视图交互不生效,是因为点击事件的响应优先级是先判断父视图本身的交互属性,再向下传递给子视图。UICollectionView只要开启了用户交互,哪怕背景是透明的,也会优先接收点击事件,不会直接透传给下层视图。
通用解决方案(同时保留cell的交互能力)
重写UICollectionView的hitTest:withEvent:方法,判断点击位置是否落在需要响应的交互元素(比如cell、header/footer、添加的交互子视图)上,如果不是就返回nil,让事件向下传递给下层的按钮。
Swift 代码示例
class PassthroughCollectionView: UICollectionView { override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { let hitView = super.hitTest(point, with: event) // 如果点击的是collectionView本身(不是cell/子交互视图),就返回nil透传事件 if hitView == self { return nil } return hitView } }
Objective-C 代码示例
@implementation PassthroughCollectionView - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { UIView *hitView = [super hitTest:point withEvent:event]; if (hitView == self) { return nil; } return hitView; } @end
之后把你项目里的UICollectionView替换为这个自定义类即可,既能正常响应cell、 header/footer的点击事件,背景区域的点击也会透传给下层的按钮。
特殊场景简易方案(不需要cell交互)
如果你的collectionView不需要任何交互(cell也不用点击),直接把UICollectionView的userInteractionEnabled属性设为false即可,此时整个collectionView都不会拦截任何点击事件,下层按钮可以正常响应。
布局示例
内容的提问来源于stack exchange,提问作者crost
相关产品推荐
相关产品推荐


