Storyboard创建的Table view cell内嵌Collection view无法滚动问题
Table View Cell内嵌Collection View滚动失效排查(Storyboard场景)
针对Collection View已正确放置在Table View Cell的contentView层级下、父Table拦截所有手势导致Collection无法滚动的场景,按以下顺序逐一检查配置即可:
- 检查Collection View基础滚动配置
选中Storyboard中的内嵌Collection View,在右侧属性检查器确认Scroll Enabled选项为勾选状态,不要误选Scrolling Locked这类禁用滚动的选项;如果绑定了IBOutlet属性,确认代码中没有手动将collectionView.isScrollEnabled设为false。 - 检查约束与内容尺寸有效性
给Collection View添加的四边约束必须相对Cell的contentView而非Cell本身设置,避免布局异常导致Collection实际frame为0;同时确认Collection View的内容总尺寸(横向滚动看总item宽度、纵向滚动看总item高度)大于Collection自身的可视frame尺寸——内容尺寸不超出可视范围时,系统不会触发Collection的滚动逻辑,会直接把手势传递给父Table,和拦截表现完全一致。 - 检查滚动方向与手势优先级配置
内嵌Collection的滚动方向必须和父Table View的滚动方向垂直(Table默认纵向滚动,内嵌Collection建议设为横向滚动),同方向滚动时系统默认优先响应父视图的滚动事件。
选中父Table View,在属性检查器中将Delays Content Touches选项取消勾选,该选项默认开启时会延迟子视图的触摸响应,极易把Collection的滚动手势识别为Table的滚动;如果有自定义手势,确认没有给父层级手势设置cancelsTouchesInView = true拦截Collection区域的触摸事件。
若仍存在手势冲突,可给Collection View的pan手势设置代理,实现同时响应手势的逻辑:// 放在自定义TableViewCell类中,记得让类遵循UIGestureRecognizerDelegate协议 override func awakeFromNib() { super.awakeFromNib() collectionView.panGestureRecognizer.delegate = self } func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { // 仅允许Collection的平移手势和父Table手势同时响应 return gestureRecognizer == collectionView.panGestureRecognizer } - 检查交互层级配置
依次选中Cell的contentView、Collection View,确认属性检查器中User Interaction Enabled为勾选状态;同时检查视图层级,不要有透明的遮挡View盖在Collection View上层,透明视图会拦截触摸事件导致Collection无法响应手势。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

