簡體   English   中英

減慢CADisplayLink間隔

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM