iOS-CADisplayLink详解以及与NSTimer对比

时间:2021-09-20 20:34:10

CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器;

CADisplayLink是属于 QuartzCore 框架的,所以和UI界面以及图像的渲染有很大的关系;

CADisplayLink官方文档


这里利用CADisplayLink做了一个计时器,实现效果挺好的

iOS-CADisplayLink详解以及与NSTimer对比


01、iOS设备的屏幕刷新频率是固定的,CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高。

02、CADisplayLink使用场合相对专一,适合做UI的不停重绘,比如自定义动画引擎或者视频播放的渲染。NSTimer的使用范围要广泛的多,各种需要单次或者循环定时处理的任务都可以使用.

03、在UI相关的动画或者显示内容使用 CADisplayLink比起用NSTimer的好处就是我们不需要在格外关心屏幕的刷新频率了,因为它本身就是跟屏幕刷新同步的。


    CADisplayLink 比较简单,初始化方法只有一个,类方法
+ (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel;
// 将定时器添加到 runloop 运行循环中
- (void)addToRunLoop:(NSRunLoop *)runloop forMode:(NSString *)mode;
// 将定时器从 runloop 运行循环中移除
- (void)removeFromRunLoop:(NSRunLoop *)runloop forMode:(NSString *)mode;
// 注销 CADisplayLink 定时器
- (void)invalidate;
// 是否暂停
@property(getter=isPaused, nonatomic) BOOL paused;
// 设置时间间隔
@property(nonatomic) NSInteger frameInterval;


CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(addNum)];

02.将定时器添加到 runloop 运行循环中

  • FOUNDATION_EXPORT NSString * const NSDefaultRunLoopMode; // RunLoop默认运行模式,在UI控件拖拽模式下无效
  • FOUNDATION_EXPORT NSString * const NSRunLoopCommonModes; // RunLoop普通运行模式,适用于一般的UI控件事件中
  • NSRunLoopCommonModes 模式比 NSDefaultRunLoopMode更高级
    [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

03.设置时间间隔,类型是NSInteger,默认为1.但实际意义是帧,默认每帧调用一次

  • 在iOS中,每一帧是60HZ频率,也就是每一秒刷新60次,所以默认1秒方法执行60次
  • 如果想设置每一秒执行一次,需设置 frameInterval 为 60
 displayLink.frameInterval = 60; 

04.设置是否暂停,pause属性默认是NO

    [displayLink setPaused:YES];

CADisplayLink定时器的一般操作

开启定时器

- (IBAction)begin:(id)sender {
self.displayLink.paused = NO;
}

暂停定时器

- (IBAction)pause:(id)sender {
self.displayLink.paused = YES;
}

停止定时器(销毁)

- (IBAction)stop:(id)sender {
self.displayLink.paused = YES;
[self.displayLink invalidate];
self.displayLink = nil;
}