【问题标题】:How can I detect orthogonal scroll events when using `UICollectionViewCompositionalLayout`?使用“UICollectionViewCompositionalLayout”时如何检测正交滚动事件?
【发布时间】:2019-12-28 20:18:27
【问题描述】:

在视频Advances in Collection View Layout - WWDC 2019 中,Apple 引入了一项新的“正交滚动行为”功能。我有一个几乎与OrthogonalScrollingViewController 相同的视图控制器example code。特别是我的收藏视图是垂直布局的,每个部分都可以水平滚动(我使用section.orthogonalScrollingBehavior = .groupPaging)。

我想让我的所有部分一致水平滚动。以前,我在每个水平集合视图上监听scrollViewDidScroll,然后手动设置其他的内容偏移量。但是,使用新的orthogonalScrollingBehavior 实现,当我水平滚动时,scrollViewDidScroll 永远不会在委托上被调用。如何使用新 API 检测水平滚动事件?

如果有其他方法可以使这些部分一起水平滚动,我也愿意接受其他建议。

【问题讨论】:

  • 听起来像向 Apple 提出的增强请求是有必要的。
  • 好的,我刚刚向 Apple 提交了功能请求。我暂时把这个问题搁置一旁,希望其他人有一个临时解决方案。
  • 嗨,克里斯,你有没有找到解决这个问题的方法?我有点同样的问题——我希望集合视图中的所有行同时正交滚动——而且我正在为 iOS 11 及更高版本进行部署,所以我什至不能使用组合布局的东西......有点困在这里:(跨度>
  • @HoustonDuane 如果你不使用组合布局,你可以只在每个水平集合视图上监听 scrollViewDidScroll,并设置其他水平滚动视图的内容偏移量来匹配。
  • @ChrisChute Million 感谢您的回答,但随着我们深入研究此实现,还有更多需要考虑:

标签: ios swift uicollectionview uicollectionviewlayout wwdc


【解决方案1】:

你可以使用这个回调:

let section = NSCollectionLayoutSection(group: group)

section.visibleItemsInvalidationHandler = { [weak self] (visibleItems, offset, env) in
}

【讨论】:

  • 我不太明白这将如何帮助您滚动不同的正交部分?也许我错过了什么
  • @Chris 您可以检查 visibleItems.last?.indexPath 或 visibleItems.first?.indexPath 以确定哪个集合视图部分或项目可见。
【解决方案2】:

这是一个 hacky 解决方案。渲染正交部分后,您可以通过 collectionView 上的子视图访问它。然后,您可以检查子视图是否是 UIScrollView 的子类并替换委托。

collectionView.subviews.forEach { (subview) in
    if let v = subview as? UIScrollView {
        customDelegate.originalDelegate = v.delegate!
        v.delegate = customDelegate
    }
}

一个棘手的问题是您想要捕获它的原始委托。这样做的原因是因为我注意到您必须调用 originalDelegate.scrollViewDidScroll(scrollView) 否则该部分不会完全呈现出来。

换句话说:

class CustomDelegate: NSObject, UIScrollViewDelegate {
    var originalDelegate: UIScrollViewDelegate!
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        originalDelegate.scrollViewDidScroll?(scrollView)
    }
}

【讨论】:

  • 这确实是非常 hacky 并且可能会在未来的 iOS 版本中中断,因为它依赖于内部实现细节。
【解决方案3】:

我找到了一种方便的方法来处理这个问题,你可以避免设置正交滚动并使用配置来代替:

let config = UICollectionViewCompositionalLayoutConfiguration()
config.scrollDirection = .horizontal
let layout = UICollectionViewCompositionalLayout(sectionProvider:sectionProvider,configuration: config)

这将调用collectionview 的所有滚动代理。希望这对某人有所帮助。

【讨论】:

    【解决方案4】:

    你可以这样做:

    section.visibleItemsInvalidationHandler = { [weak self] visibleItems, point, environment in
                let indexPath = visibleItems.last!.indexPath
                self?.pageControl.currentPage = indexPath.row
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      相关资源
      最近更新 更多