UICollectionView 在单独的子视图控制器中的 UITableView 之上
Posted
技术标签:
【中文标题】UICollectionView 在单独的子视图控制器中的 UITableView 之上【英文标题】:UICollectionView on top of a UITableView in separate child view controllers 【发布时间】:2020-05-05 03:09:17 【问题描述】:我的视图层次结构如下。
ParentContainerVC
..UINavigationViewController (child of ParentContainerVC)
....UITableViewController (child of navigation view controller)
..UICollectionViewController (child of ParentContainerVC)
托管 UICollectionView 的 VC 正确拦截了滚动事件,但下面的 UITableView 仍然冻结。两者的大小都可以占据屏幕的整个宽度/高度,但应该允许独立滚动(如果您想知道,UICollectionView 不会遮挡下面的 UITableView - 但用户需要能够在同一时间)。
在托管集合视图的 VC 中,我实现了:
extension UICollectionViewController: UIGestureRecognizerDelegate
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool
return true
但这并没有帮助。我认为这是因为视图控制器已被添加为子控制器,并且这不适用于同级视图控制器。
ParentContainerVC
只是一个带有两个孩子的容器视图控制器。我必须做些什么才能让触摸/滚动事件在两个孩子/兄弟姐妹之间独立工作?
【问题讨论】:
【参考方案1】:这有点棘手,但我最终想通了。问题本质上是,一旦一个视图(深度优先)通过了命中测试,命中测试视图后面或周围的其他视图将停止接收触摸。
诀窍是在所有其他内容之前添加另一个虚拟UIView
,以协调和合并所有触摸。然后从每个UIScrollView
/ UICollectionView
/ UITableView
子视图控制器中获取.panGestureRecognizer
,并将它们添加到这个虚拟视图控制器中。
现在,无论视图层次结构中的哪个位置,所有可滚动列表都开始滚动并响应触摸,而无需摆弄hitTest
或子类化。
要进一步细化哪个滚动视图首先对触摸做出反应,您可以添加另一个UIPanGestureRecognizer
,然后执行.require(toFail: myNewPanGesture)
之类的操作,以及您希望此手势如何以及何时失败的实现。这样您就可以控制要先滚动的可滚动内容。
【讨论】:
以上是关于UICollectionView 在单独的子视图控制器中的 UITableView 之上的主要内容,如果未能解决你的问题,请参考以下文章
添加 UICollectionView 作为 UICollectionReusableView reloadData 的子视图不起作用,我想念啥?
从 UICollectionView Swift 3 在单独的视图控制器中查看图像