在视频Advances in Collection View Layout - WWDC 2019中,Apple引入了新的“正交滚动行为”功能。我在他们的example code中有一个与OrthogonalScrollingViewController
几乎相同的视图控制器。特别是我的收藏视图是垂直放置的,每个部分都可以水平滚动(我使用section.orthogonalScrollingBehavior = .groupPaging
)。
我想让我的所有部分都水平滚动一致。以前,我在每个水平集合视图上监听scrollViewDidScroll
,然后手动设置其他视图的内容偏移量。但是,使用新的orthogonalScrollingBehavior
实现,当我水平滚动时,永远不会在委托上调用scrollViewDidScroll
。如何使用新的API检测水平滚动事件?
如果还有另一种方法可以使各部分水平滚动,那么我也欢迎其他建议。
答案 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
}