引言
在App的開發(fā)中定時器是常用的組件白修。我們在55 - Swift 之 Timer (NSTimer )定時器已經(jīng)介紹了Timer妒峦。本篇我們將介紹CADisplayLink。
1兵睛、CADisplayLink 是什么肯骇?
CADisplayLink 是一種觸發(fā)時間和屏幕刷新頻率相同的定時器。
2祖很、CADisplaylink 的基本使用方法笛丙。
我們在項目中創(chuàng)建一個 CADisplayLink 的對象 A ,同時給他一個 target 和一個 Selector ; 然后假颇,將 A 添加到 RunLoop 中若债,在屏幕刷新的時候就會觸發(fā) A 的 Selector 方法。
3拆融、 CADisplayLink 的幾個參數(shù)介紹
1蠢琳、 timestamp
timestamp 是指當(dāng)前幀開始刷新的時間。
2镜豹、duration
duration 是一幀刷新所用時的時間傲须。
3、 targetTimestamp
targetTimestamp 是下一幀開始刷新的時間趟脂。
注意:(默認情況下)
targetTimestamp 和 duration 和 timestamp 在 默認情況下 之間的關(guān)系如下:
timestamp 與 targetTimestamp 相差 duration 泰讽;即是 :
duration = targetTimestamp - timestamp 的關(guān)系。
4昔期、isPaused
isPaused 是阻止屏幕刷新的進行的參數(shù)已卸。isPaused 如果為 true 屏幕刷新停止。isPaused 為 flase 屏幕開始刷新硼一。
5累澡、invalidate() 函數(shù)
invalidate() 這個函數(shù)我們并不陌生,我們在 OC 的 NSTime 和 Swift 的 Timer 中都見過它般贼。invalidate() 該函數(shù)的作用是停止定時愧哟,同時釋放定時器對象奥吩。
6、open func add(to runloop: RunLoop, forMode mode: RunLoopMode) 函數(shù)
open func add(to runloop: RunLoop, forMode mode: RunLoopMode) 該函數(shù)的作用是將創(chuàng)建的 CADisplayLink 對象加入到 RunLoop 中蕊梧,才能在屏幕刷新的時候霞赫,執(zhí)行定時器的 selector 方法。
7肥矢、 open func remove(from runloop: RunLoop, forMode mode: RunLoopMode) 函數(shù)
open func remove(from runloop: RunLoop, forMode mode: RunLoopMode) 該函數(shù)的作用是將添加的 CADisplayLink 對象從 RunLoop 中移除端衰,停止定時作用,減輕Cup的負擔(dān)甘改。
8 旅东、 preferredFramesPerSecond
preferredFramesPerSecond 該參數(shù)的作用是設(shè)置屏幕在一分鐘內(nèi)刷新的幀數(shù)。默認為60楼誓,當(dāng)設(shè)置為0 的時候?qū)⒑推聊凰⑿骂l率相同玉锌,該參數(shù)在 ios 10.0 以上可是使用。
4疟羹、 CADisplaylink 的使用
// MARK: 創(chuàng)建一個CADisplayLink的對象
func budlingDisplayLink() -> Void {
// 創(chuàng)建對象
let displayLink = CADisplayLink.init(target: self, selector: #selector(displayLinkClick(_:)))
// 設(shè)置觸發(fā)頻率
if #available(iOS 3.1, *) {
//設(shè)置一秒內(nèi)有幾幀刷新主守,默認60,即是一秒內(nèi)有60幀執(zhí)行刷新調(diào)用榄融。
displayLink.preferredFramesPerSecond = 3
}else {
displayLink.frameInterval = 2
}
// 加入循環(huán)
displayLink.add(to: RunLoop.main, forMode: .defaultRunLoopMode)
}
@objc func displayLinkClick(_ displayLink:CADisplayLink) -> Void {
// 當(dāng)前幀開始刷新的時間
print(displayLink.timestamp)
// 一幀刷新使用的時間
print(displayLink.duration)
// 下一幀開始刷新的時間
print(displayLink.targetTimestamp)
// TODO: displayLink.timestamp 與 displayLink.targetTimestamp 相差 displayLink.duration 参淫;即是 : displayLink.duration = displayLink.targetTimestamp - displayLink.timestamp 的關(guān)系。
// 暫停幀的刷新 true:停 ; false:開始
displayLink.isPaused = true
// 將定時器移除主循環(huán)
displayLink.remove(from: RunLoop.main, forMode: .defaultRunLoopMode)
// 停止定時器
displayLink.invalidate()
}