gpt4 book ai didi

ios - UIScrollView contentOffset 更改时不更新

转载 作者:行者123 更新时间:2023-11-30 11:35:59 30 4
gpt4 key购买 nike

看到围绕更改 ScrollView 的内容偏移属性的奇怪问题。

我有一个CADisplayLink,它每帧调用一个方法。该方法计算调整内容偏移量以产生自动滚动类型的效果。

@objc private func tick() {

let fps = 1 / (displayLink.targetTimestamp - displayLink.timestamp)

let relativeAutoscrollAmount = autoscrollAmount / CGFloat(fps)

scrollView.contentOffset.x += relativeAutoscrollAmount
}

autoscrollAmount 是一个 CGFloat 属性,表示每秒移动多少像素。在像 iPhone 这样的 60Hz 屏幕上,如果此属性为 5,则意味着每次调用该方法都会移动 5/60。但是,内容偏移量实际上永远不会改变!无论是在视觉上还是在内存中,我可以随时打破并检查它,它总是 0!

请注意,如果我每次将其调整 1 或更大,它就可以正常工作。不过,动画的速度还远远不够快。

有什么想法吗?

编辑:显然,您实际上不能一次调整小于一个像素,但是当我之前使用约束常数执行此操作时,系统只是计算了如何处理此问题。 (我假设每隔几个刻度移动一次)。

最佳答案

我相信我有答案,或者至少有一个基于有一些很好的证据支持的理论的解释。我们开始吧...

在问题中,我提供了 5/60 的示例,其中 5 是每秒移动的像素数,60 是我的屏幕刷新率。结果约为 0.083,正如我所说,这不会导致 contentOffset 发生任何更新。

此时,我假设最小值为 1(因为您无法更改半个像素),但事实并非如此。我开始尝试不同的十进制值,希望找到 contentOffset 更新停止发生的阈值。

经过多次尝试和错误,我发现了这个值(value)。它是0.167。在我看来,这完全没有任何意义。但显然一定有什么东西,所以我开始以各种方式操纵它,试图观察某种模式。

很快就清楚了 0.167 * 6 == 1,虽然这是一个有趣的观察,但似乎又没有什么意义。直到您注意到我测试时使用的 iPhone X 显示屏的刷新率为 60Hz10 乘以 6。在这一点上,我仍然在黑暗中盲目刺伤,但这至少是我可以探索一下的线索。

据此,我推测系统每 6 毫秒评估一次图层位置的变化,或者更实际的是,每个显示周期评估 10 次。这支持我所看到的行为,如果移动值传递太小(即它不能用每个显示周期 10 次的定理表示),它就会被忽略。

这是一个相当大胆的猜测,所以我决定看看是否可以收集证据来支持这个理论。我启动了配备 120Hz 显示屏(而不是 iPhone X 上的 60Hz 显示屏)的 iPad Pro,看看是否存在趋势。果然有。现在,看到运动的最小值是60Hz 屏幕上的一半。考虑到更高的刷新率(事实上是双倍),以及每个屏幕周期 10 次更新的最初假设,我现在看到每个屏幕周期有 20 次更新,每 6 毫秒,和以前一样。这里面肯定有关系。

现在我想强调,这纯粹是猜测,但至少我今晚可以 sleep 时知道为什么会发生这种情况!我也很想听听其他人的想法。

关于ios - UIScrollView contentOffset 更改时不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49772735/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com