我们知道,凡是动画一定会涉及到时间问题,UI 动画也不例外,定时更是一个十分常用的操作。本文主要介绍一种定时器——CADisplayLink的基本使用。

基本描述

简单来说,CADisplayLink 是一个提供了周期性调用 selector 的机制,类似于 NSTimer。和其他 CoreAnimation 类一样,要使用 CADisplayLink 首先也需要引入 QuartzCore.framework 库。

如何启动

let displayLink = CADisplayLink(target: self, selector: "handleDisplayLink:")
displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)

实例化 CADisplayLink 并将其加入运行循环后,定时将自动启动,开始周期性的执行 selector 方法,接下来你只需要实现该方法即可。

func handleDisplayLink(displayLink: CADisplayLink!) {
	// handle things...
}

如何停止

学会了启动,还需要停止,只需要调用 invalidate() 方法即可。

displayLink.invalidate()

那么,你一定想问,CADisplayLink 与 NSTimer 到底有什么不同?

要解释这个问题,首先我们要知道,CADisplayLink 是一个能够”和屏幕刷新率同步频率”的定时器,当它的实例注册到运行循环后,一旦屏幕显示内容刷新结束就会向指定的 target 发送指定 selector 消息。而 NSTimer 注册到运行循环后,一旦周期时间到达就会向指定的 target 发送指定 selector 消息。

基于上述理由,可以知道 CADisplayLink 的默认周期应该是每秒 60 次,与设备刷新率保持同步,当然,你可以通过 frameInterval 属性进行修改其周期为每秒 60/ frameInterval 次。而 NSTimer 的在这一点上要灵活和方便很多。同时,相信你已经意识到, CADisplayLink 的精确度也是很高的。而相对来说 NSTimer 在精确度问题上就显得有些不足,它甚至会被推迟到下一次运行循环才被执行。

在实际应用中,CADisplayLink 通常被用在频繁的界面重绘中。NSTimer 则被广泛应用在多种情景下。当然,每秒 60 次的频率并不能够 100% 的完全保证,他仍然受制于 CPU 的忙碌程度、执行方法的时间开销等因素。

如果你有兴趣,你可以参考 官方文档 获取更多内容。