CADisplayLink相当于一个定时器,比起NSTimer,它可以确保系统渲染每一帧的时候我们的方法都被调用,从而保证了动画的流畅性。
iOS设备的屏幕刷新频率是固定的,CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高。NSTimer的精确度相对显得较低;CADisplayLink使用场合相对专一,适合做UI的不停重绘,比如自定义动画引擎或者视频播放的渲染。NSTimer的使用范围要广泛的多,各种需要单次或者循环定时处理的任务都可以使用。
相关属性
preferredFramesPerSecond
(iOS10用这个方法)
标识每秒钟调用几次,比如每秒钟调用10次,那就是每0.1秒调用一次frameInterval
(ios10被弃用)
标识间隔多少帧调用一次selector方法。
CADisplayLink的selector每秒调用次数 = 60 / frameInterval。
苹果文档中还提到:如果应用不能及时提供显示帧,则应该降低帧率,可以通过增大 frameInterval 这一属性的值来降低动画帧率。frameInterval 默认值为 1,表示每帧都回调一次selector。在没有卡顿时,iOS 设备屏幕显示每秒刷新60次,意味着 frameInterval 为默认值时,每秒回调60次 selector,当frameInterval 改为2时,每秒回调30(60/2)次 selector。duration
只读的CFTimeInterval值,提供每帧之间的时间,也就是屏幕每次刷新的时间。timestamp
只读的CFTimeInterval值,表示屏幕显示的上一帧的时间戳,这个属性通常被target用来计算下一帧中应该显示的内容。paused
通过设置paused属性为YES可以暂停selector调用,默认值NO
注: CADisplayLink是不能被继承的
使用CADisplayLink
在应用中创建一个新的CADisplayLink 对象,把它添加到一个runloop中,并给他提供一个 target和select在屏幕刷新的时候调用。如下:
CADisplaylink 与 NSTimer 类似,都可以以一定的时间间隔触发回调 selector,不同点在于 CADisplaylink 的时间间隔是与屏幕的刷新频率相关联的,这一点决定了 CADisplaylink 的应用多与显示有关。
相关问题
- 当scrollview / tableview滚动时CADisplayLink停止响应。
要解决这个问题需要简单了解一下runloop的知识,runloop可以理解为cocoa下的一种消息循环机制,用来处理各种消息事件,我们在开发的时候并不需要手动去创建一个runloop,因为框架为我们创建了一个默认的runloop,通过[NSRunloop currentRunloop]可以得到一个当前线程下对应的runloop对象,不过需要注意的是不同的runloop之间消息的通知方式。在开启一个NSTimer或CADisplayLink实质上是在当前的runloop中注册了一个新的事件源,而当scrollView滚动的时候,当前的MainRunLoop是处于UITrackingRunLoopMode的模式下,在这个模式下是不会处理NSDefaultRunLoopMode的消息(因为RunLoop Mode不一样),要想在scrollView滚动的同时也接受其它runloop的消息,就不能将Mode参数设置为NSDefaultRunLoopMode,而应该设置为NSRunLoopCommonModes。