繁体   English   中英

UIScrollView contentOffset更改后不更新

[英]UIScrollView contentOffset not updating when changed

看到围绕更改滚动视图的content offset属性的奇怪问题。

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

@objc private func tick() {

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

    let relativeAutoscrollAmount = autoscrollAmount / CGFloat(fps)

    scrollView.contentOffset.x += relativeAutoscrollAmount
}

autoscrollAmountCGFloat属性,表示每秒移动多少像素。 在iPhone等60Hz的屏幕上,如果此属性为5,则表示该方法每次调用移动5/60。但是,内容偏移量实际上从未改变! 无论是视觉上还是内存中,我都可以随时对其进行检查并检查,并且始终为0!

请注意,如果我每次将其调整为1或更大,它就可以正常工作。 不过,动画远不能很快做到这一点。

有什么想法吗?

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

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

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

在这一点上,我假设最小值为1(因为您无法将像素更改为半像素),但实际上并非如此。 我开始尝试使用不同的十进制值,以期找到停止对contentOffset进行更新的阈值。

经过大量的反复试验,我发现了这一价值。 0.167 在我看来,这绝对没有任何意义。 但是显然必须有一些东西,因此我着手以各种方式对其进行操作以尝试观察某种模式。

很快就知道0.167 * 6 == 1 ,尽管这是一个有趣的观察,但似乎又没有什么意义。 直到您注意到我正在测试的iPhone X上的显示屏刷新率为60Hz ,是6的10倍 此时,我仍然在黑暗中盲目刺伤,但这至少是我可以探索的线索。

据此,我推测系统每6ms评估一次图层位置的变化,或者更实际地,每个显示周期评估10次。 这支持我所看到的行为,即使移动值传递的值太小(即每个显示周期定理在这10次中都无法表示),则可以将其忽略。

这是一个很大胆的推测,因此我决定看看是否可以收集证据来支持该理论。 我启动了具有120Hz显示屏(而不是iPhone X上的60Hz显示屏)的iPad Pro,以查看是否存在趋势。 果然有。 现在,看到运动的最小值是60Hz屏幕上的一半 鉴于更高的刷新率(实际上是两倍),以及最初的假设是每个屏幕周期10次更新,我现在看到与以前一样, 每个屏幕周期每6ms更新20次。 这里肯定有关系。

现在,我想强调的是,这纯粹是猜测,但至少我今晚可以睡个好觉,以了解发生这种情况的原因! 我也很想听听别人的想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM