自定义UIView子类中的UICollectionView无法响应触摸事件怎么解决?
问题原因与解决方案
核心问题根因
你遇到的无法响应触摸、滚动失效的问题是由自定义父视图未设置有效frame导致的,符合iOS触摸事件传递的机制规则:
- 你在ViewController中实例化
DrawUI_mainCollectionView时调用的是无参数初始化方法DrawUI_mainCollectionView(),这会触发默认的init(frame: .zero),你的自定义UIView的bounds为零大小。 - 父视图
clipsToBounds默认值为false,所以超出父视图边界的子视图(UICollectionView)内容可以正常渲染,但iOS触摸事件传递规则要求:只有触摸点落在父视图bounds范围内时,事件才会向下传递给子视图,因此你的CollectionView虽然可见,但完全收不到触摸事件。
次要潜在问题
你的CollectionView本身的frame设置也有溢出风险:你给CollectionView设置的y偏移为120,高度为屏幕高度kScreenHeight,那么CollectionView的底部位置为120 + kScreenHeight,即便父视图设置为全屏大小,CollectionView底部超出屏幕的部分也无法响应触摸。
修复步骤
- 实例化自定义View时传入有效frame,例如设置为和屏幕尺寸一致:
let collectionView = DrawUI_mainCollectionView(frame: UIScreen.main.bounds) self.view.addSubview(collectionView)
- 调整CollectionView的高度,避免超出父视图边界,修改
setup方法中的frame计算逻辑:
let collectionViewFrame = CGRect(x: 0, y: offset, width: Double(kScreenWidth), height: self.bounds.height - offset)
- 可选适配方案:如果你确实有子视图超出父视图边界仍要响应触摸的需求,可以重写自定义View的
point(inside:with:)方法,调整触摸响应的判定范围,但更推荐优先使用正确的frame布局,符合UIKit设计规范。
内容的提问来源于stack exchange,提问作者Ricardo Ruiz
相关产品推荐
相关产品推荐

