簡體   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