swift - UICollectionView 在单独的子视图控制器中的 UITableView 之上
问题描述
我的视图层次结构如下。
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
只是一个带有两个孩子的容器视图控制器。我该怎么做才能让触摸/滚动事件独立地在两个孩子/兄弟姐妹之间工作?
解决方案
这有点棘手,但我最终想通了。问题本质上是,一旦一个视图(深度优先)通过了命中测试,命中测试视图后面或周围的其他视图将停止接收触摸。
诀窍是在所有其他内容之前添加另一个虚拟对象UIView
以编排和合并所有触摸。然后.panGestureRecognizer
从每个UIScrollView
//子视图控制器中获取UICollectionView
,UITableView
并将它们添加到这个虚拟视图控制器中。
现在,无论视图层次结构中的哪个位置开始滚动并响应触摸,所有可滚动列表都无需摆弄hitTest
或子类化。
要进一步细化哪个滚动视图首先对触摸做出反应,您可以添加另一个UIPanGestureRecognizer
,然后执行类似的操作.require(toFail: myNewPanGesture)
以及您希望此手势如何以及何时失败的实现。通过这种方式,您可以控制要首先滚动的可滚动内容。
推荐阅读
- swift - 在 SwiftUI 中使用图像和 PageView 内存不足
- mysql - 如何将最新的 TimesStamp 添加到 Google Gauge
- java - 在 Antlr 4 中重复评估同一访客
- python - Scikit-learn LinearRegression:如何解决错误“fit()缺少1个必需的位置参数:'y'”?
- java - Java Spark - 在使用条件时对 Spark 数据框列进行多值检查
- julia - 如何在 julia Genie 应用程序中设置 cors 标头以允许来自不同域的 POST 请求
- javascript - done() 函数的含义
- php - 在 PHP 中将 SVG 加载为内联的最佳方法 - cURL 或 file_get_contents
- c# - 使用c#在windows中获取设备ID
- python - 使用 Pymongo / MongoDB 迭代游标对象的有效方法