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 在单独的视图控制器中查看图像

UICollectionView 单元格子视图不调整大小

对包含在 2 个单独的父 UIView 中的子视图进行碰撞检测?

如何显示从单独的 NIB 文件加载的子视图