当动画为假时,如何检测UIScrollView已完成滚动?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当动画为假时,如何检测UIScrollView已完成滚动?相关的知识,希望对你有一定的参考价值。

我有一个名为timeline的collectionView,它在这里的第二行到最后一行以编程方式滚动:

internal func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
        if !onceOnly {
            let indexToScrollTo = IndexPath(row: self.posts.count - 1, section: 0)
            collectionView.scrollToItem(at: indexToScrollTo, at: .left, animated: false)
            let firstPost = posts.first?.timeStamp
            let firstOfFirstMonth = firstPost?.startOfMonth()
            let diff = posts.last?.timeStamp.months(from: firstOfFirstMonth!)
            //self.currentPostMonth = diff
            let monthCellIndexPath = IndexPath(row: diff!, section: 0)
            timeline.scrollToItem(at: monthCellIndexPath, at: .centeredHorizontally, animated: false)
            onceOnly = true
        }
    }

稍后..我试图检测到这已完成滚动

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    if scrollView == timeline {
        print("Did finish")
    }
}

func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
    if scrollView == timeline {
        print("Did finish")
    }
}

滚动完成后,两个print语句都不会触发。我认为部分原因是因为动画=假。当我将其设置为true时,它会打印正确完成 - 我认为特别是scrollViewDidEndScrollingAnimation打印,即使scrollViewDidEndDecelerating仍然无效,因为它以编程方式滚动。

如何检测此卷轴已完成?

答案

我想因为你将collectionView与scrollView进行比较

if scrollView == timeline

这是false,BTW你可以使用

func scrollViewDidScroll(_ scrollView: UIScrollView)

如果没有动画,则在下一行之后

timeline.scrollToItem(at: monthCellIndexPath, at: .centeredHorizontally, animated: false)

运行你想要的,因为它会在滚动成功结束时连续发生,无需在scrollView的委托方法中设置它是否被调用

以上是关于当动画为假时,如何检测UIScrollView已完成滚动?的主要内容,如果未能解决你的问题,请参考以下文章

当条件为假时不执行其他函数的`if`语句

当条件为假时执行 If 语句 True 块

当“objectCaching”为假时,使用“globalCompositionOperation”设置为“source-atop”的屏蔽不起作用

为啥当值为假时我不能传递过滤数据(它是布尔值)

当可点击为假时更改按钮的背景颜色

检测用户何时中断 UIScrollView 动画