【问题标题】:How to detect a UIScrollView has finished scrolling when animation is false?动画为假时如何检测 UIScrollView 已完成滚动?
【发布时间】:2019-02-09 23:03:55
【问题描述】:

我有一个名为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")
    }
}

滚动完成后不会触发任何打印语句。我认为部分是因为动画=假。当我将其设置为 true 时,它​​会打印出是否正确完成 - 我认为特别是 scrollViewDidEndScrollingAnimation 打印,即使 scrollViewDidEndDecelerating 仍然没有执行任何操作,因为它是以编程方式滚动的。

如何检测到此卷轴已完成?

【问题讨论】:

    标签: ios swift uiscrollview uicollectionview


    【解决方案1】:

    我认为是因为您将 collectionView 与 scrollView 进行了比较

    if scrollView == timeline
    

    这是false,顺便说一句,你可以使用

    func scrollViewDidScroll(_ scrollView: UIScrollView)
    

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

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

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

    【讨论】:

    • 如果 scrollView == 时间线我没有问题。时间线是一个collectionView,但我认为这意味着它也是一个scrollView,对吗?无论如何,这等同于真实。 scrollViewDidScroll 是完美的。如果没有动画,你可能只是把它放在 scrollToItem 之后是对的。我在 scrollToItem 之后无法访问单元格,但滚动部分确实有效,所以谢谢!
    • 仅供参考,如果您想检查 scrollView 和时间线是否是同一个对象,您必须使用身份运算符 (===)。来自 Swift 文档:“请注意,等同于(由三个等号或 === 表示)并不意味着与等于(由两个等号或 == 表示)相同。等同于意味着两个常量或类类型的变量指的是完全相同的类实例。等于意味着两个实例在值上被认为相等或等价,对于相等的某些适当含义,由类型的设计者定义。"
    猜你喜欢
    • 2010-11-02
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2011-12-08
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多