如何检测scrollToItem是否滚动

时间:2019-05-24 10:13:17

标签: ios swift uicollectionview uiscrollview uicollectionviewcell

我正在尝试在特定位置(.bottom)上滚动一个单元格,并在滚动动画完成后运行一些代码。问题在于scrollToItem函数没有为此提供完成处理程序,唯一的解决方案是使用委托(scrollViewDidEndScrollingAnimation)。使用该方法,如果单元格已经在该位置.didEndScrollAnim上,我就有一个问题。永远不会被调用。

是否可以找到某个单元格是否位于UICollectionView.ScrollPosition.bottom上?

collectionView.scrollToItem(at: indexPath, at: [.bottom,.centeredHorizontally], animated: true)

当单元格位于所需位置[.bottom]时,我希望能够运行一部分代码,并且如果需要滚动,还可以对滚动进行动画处理。

3 个答案:

答案 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
    }
)