[英]Slow down CADisplayLink interval
我將NSTimer用於我的iOS應用程序,但由於SetNeedsDisplay而無法獲得想要的結果。
我進行了一些研究,找到了CADisplayLink,它給了我想要的動畫效果。 可悲的是,我無法像使用NSTimer一樣放置計時器。
[NSTimer scheduledTimerWithTimeInterval:0.250 target:self selector:@selector(setGaugeLevel) userInfo:nil repeats:YES];
我的CADisplayLink調用我的函數的速度太快了,我想給它一個與我使用NSTimer時(0.250秒)相同的計時器。
CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(setGaugeLevel)];
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
setGaugeLevel函數內部只有一個循環,其中包含SetValue函數,該循環在每次迭代中均包含:
[self setNeedsDisplay];
有什么辦法可以減慢速度以獲得我想要的結果嗎?
如@carton所述, CADisplayLink
用於使自己與顯示同步。 它不是通用計時器。 特別適用於實時視頻之類的情況,您希望以與同步刷新相關的方式進行更新。 顯然,這不是您的問題。
您描述的方法沒有多大意義。 調用setNeedsDisplay
不會導致視圖立即重繪。 它只是將其標記為在下一個繪制循環中重新繪制。 循環調用setNeedsDisplay
從來沒有任何意義。 setGaugeLevel
必須返回,否則視圖將永遠不會更新(因為您將掛起UI隊列)。
如果只想讓進度表以.25s的增量遞增,則只需遞增進度指示器的值並返回即可。 用NSTimer
調用它。 當達到100%時,使計時器無效,使其停止。
您甚至不需要調用setNeedsDisplay
。 進度指示器知道它們的值更改時需要重繪。
CADisplayLink
鏈接到顯示刷新率,它(通常是?)以60Hz,即每秒60幀的速度運行。 您無法控制其觸發的時間間隔,但是可以選擇設置frameInterval
,從而可以指定“顯示鏈接再次通知目標之前必須經過的幀數”。
在代碼中,添加一行以將更新限制為大約每0.25秒一次:
CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(setGaugeLevel)];
displayLink.frameInterval = 15 // 0.25s, assuming 60Hz display refresh rate
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
但是,如果您需要准確的時序而不鎖定顯示刷新率,那么最好的方法可能仍然是NSTimer
。 您遇到什么問題?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.