使用UICollectionViewCompositionalLayout时,如何检测正交滚动事件?

时间:2019-12-28 20:18:27

标签: ios swift uicollectionview uicollectionviewlayout wwdc

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

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

如果还有另一种方法可以使各部分水平滚动,那么我也欢迎其他建议。

3 个答案:

答案 0 :(得分:2)

您可以使用此回调:

let section = NSCollectionLayoutSection(group: group)

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

答案 1 :(得分:0)

这是一个骇人听闻的解决方案。渲染正交截面后,您可以通过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)
    }
}

答案 2 :(得分:0)

你可以这样做:

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