5

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

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

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

4

4 回答 4

2

您可以使用此回调:

let section = NSCollectionLayoutSection(group: group)

section.visibleItemsInvalidationHandler = { [weak self] (visibleItems, offset, env) in
}
于 2020-02-13T14:47:13.137 回答
1

这是一个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)
    }
}
于 2020-06-11T00:16:26.143 回答
0

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

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

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

于 2022-02-18T16:31:19.203 回答
0

你可以这样做:

section.visibleItemsInvalidationHandler = { [weak self] visibleItems, point, environment in
            let indexPath = visibleItems.last!.indexPath
            self?.pageControl.currentPage = indexPath.row
}
于 2021-04-22T13:41:05.370 回答