我正在尝试在特定位置(.bottom
)上滚动一个单元格,并在滚动动画完成后运行一些代码。问题在于scrollToItem
函数没有为此提供完成处理程序,唯一的解决方案是使用委托(scrollViewDidEndScrollingAnimation
)。使用该方法,如果单元格已经在该位置.didEndScrollAnim
上,我就有一个问题。永远不会被调用。
是否可以找到某个单元格是否位于UICollectionView.ScrollPosition.bottom
上?
collectionView.scrollToItem(at: indexPath, at: [.bottom,.centeredHorizontally], animated: true)
当单元格位于所需位置[.bottom
]时,我希望能够运行一部分代码,并且如果需要滚动,还可以对滚动进行动画处理。
答案 0 :(得分:0)
是的,您可以使用scrollViewDidEndDecelerating
函数,并且当滚动视图停止滚动(停止)时,将调用此函数。
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let secondItemIndex = IndexPath(item: 1, section: 0)
categoryCollectionView.selectItem(at: secondItemIndex, animated: true, scrollPosition: .centeredHorizontally)
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let secondItemIndex = IndexPath(item: 2, section: 0)
categoryCollectionView.selectItem(at: secondItemIndex, animated: true, scrollPosition: .centeredHorizontally)
}
//滚动方式不会影响此功能,因此您可以根据需要指定任何位置
答案 1 :(得分:0)
我可以想到一种方法,但是它涉及到反复调用scrollViewDidScroll
,这确实会降低屏幕的性能。
在功能scrollViewDidScroll
中:
if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) {
//reach bottom, here your code
}
答案 2 :(得分:0)
我将animated
参数设置为false
,然后使用UIView.animate()
检测动画的完成情况。
UIView.animate(withDuration: 0.2, animations: { [weak self] in
self?.collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: false)
}, completion: { [weak self] _ in
// do something after scroll animation completed
}
)