如何使用滚动视图内容偏移属性?

How to use the scroll view content offset property?

我有以下代码:

   if scrollView.contentOffset.x == 10 {
            print("works")
        }

尽管当我向左或向右滚动时,控制台上没有打印任何内容。我知道这是非常基础的,虽然我只是想在深入研究之前理解这一点。

I put this in the view did load

这意味着代码将在加载视图时检查内容偏移量。在那一刻,如果滚动视图的 x 偏移量 exactly 10,则将打印消息。它不关心在那一刻之后会发生什么。

当您手动将滚动视图滚动到某个偏移量时,您似乎希望它打印消息。

一种方法是将代码移至 scrollViewDidScroll。每次内容偏移量更改时都会调用此函数。

extension YourViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        // this checks for whether contentOffset.x is around 10 (contented shifted to the right by 10 points)
        if abs(scrollView.contentOffset.x - 10) < 1 {
            print("works")
        }
    }
}

并记得将滚动视图的委托设置为 self:

scrollView.delegate = self

请注意,我将条件更改为 abs(scrollView.contentOffset.x - 10) < 1。这是给它一些“余量”,而不是说 x 偏移量必须 恰好 10。当您滚动时,内容偏移量很少更改为恰好 10(或恰好 任何东西,就此而言)。你必须是一个非常准确的滚动器才能做到这一点 :) 因此,我允许 9 到 11 之间的任何值通过检查。但即使有这个余量,如果你快速滚动,“作品”也不会被打印出来。因为当您滚动得更快时,内容偏移量每次都会发生更大的变化。您可能需要根据自己的需要调整津贴。

如果您想在每次用户停止滚动时打印“works”,您可以实现以下两种方法:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    if abs(scrollView.contentOffset.x - 10) < 1 {
        print("works")
    }
}

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    if abs(scrollView.contentOffset.x - 10) < 1 {
        print("works")
    }
}