1. 实例代码
1.1添加成员属性
@property (nonatomic,strong) CADisplayLink *link;
@property (nonatomic,assign) CFTimeInterval startTime ;
1.2实例化displayLink,把link添加进runloop
- (void)viewDidLoad
{
[super viewDidLoad];
self.link = [CADisplayLink displayLinkWithTarget:self selector:@selector(update:)];
[self.link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
1.3实现监听方法
- (void)update:(CADisplayLink *)sender
{
// 判断是否第一次执行此方法
if (self.startTime == 0) {
self.startTime = sender.timestamp; //把link的时间戳赋值给startTime
}
CFTimeInterval deltaTime = sender.timestamp - self.startTime;
// 每次执行此方法都会判断传进来的时间戳 和 存储的startTime 之差是否>= 1
if (deltaTime >= 1) {
NSLog(@"每秒输出1次");
self.startTime = sender.timestamp; // 更新存储的startTime
}
}
1.4打印结果
2014-12-20 15:54:36.634 帧动画[11110:60b] 每秒输出1次
2014-12-20 15:54:37.651 帧动画[11110:60b] 每秒输出1次
2014-12-20 15:54:38.667 帧动画[11110:60b] 每秒输出1次
2014-12-20 15:54:39.684 帧动画[11110:60b] 每秒输出1次
2014-12-20 15:54:40.684 帧动画[11110:60b] 每秒输出1次
2014-12-20 15:54:41.701 帧动画[11110:60b] 每秒输出1次
2014-12-20 15:54:42.702 帧动画[11110:60b] 每秒输出1次
1.5CADisplayLink的其他属性
修改一下实例代码
#import "QKViewController.h"
@interface QKViewController ()
- (IBAction)pauseButton;
@property (nonatomic,strong) CADisplayLink *link;
@property (nonatomic,assign) CFTimeInterval startTime ;
@end
@implementation QKViewController
// 记录update第几次被调用
static int count;
- (void)viewDidLoad
{
[super viewDidLoad];
// 初始化link
self.link = [CADisplayLink displayLinkWithTarget:self selector:@selector(update:)];
// 添加进runloop
[self.link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
// 打印调方法前的属性值
NSLog(@"默认的frameInterval = %d",self.link.frameInterval);
NSLog(@"调用前: duration = %f,timestamp = %f",self.link.duration,self.link.timestamp);
// 修改调用频率,改成60,意味着屏幕刷新60次,才去调用update:方法
self.link.frameInterval = 60;
}
- (void)update:(CADisplayLink *)sender
{
// 每调一下update:方法,记录调用次数
count ++;
// 打印调用时的属性值
NSLog(@"duration = %f , timestamp = %f ,第%d次调用",self.link.duration,self.link.timestamp,count);
// 调用60次后,移除Link
if (count == 60) {
[self.link removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
}
// 点击storyboard的按钮触发该方法:pause属性的示例,它是个BOOL值,可以让Link开始或停止
- (IBAction)pauseButton {
self.link.paused = !self.link.paused;
// 停用Link,一定要调 -(void)invalidate
[self.link invalidate];
// 安全起见,把指针清空
self.link = nil;
}
2014-12-20 16:58:15.465 帧动画[11680:60b] 默认的frameInterval = 1
2014-12-20 16:58:15.466 帧动画[11680:60b] 调用前: duration = 0.000000,timestamp = 0.000000
2014-12-20 16:58:15.474 帧动画[11680:60b] duration = 0.016667 , timestamp = 80880.508529 ,第1次调用
2014-12-20 16:58:16.466 帧动画[11680:60b] duration = 0.016667 , timestamp = 80881.500962 ,第2次调用
2014-12-20 16:58:17.466 帧动画[11680:60b] duration = 0.016667 , timestamp = 80882.500537 ,第3次调用
2014-12-20 16:58:18.466 帧动画[11680:60b] duration = 0.016667 , timestamp = 80883.500228 ,第4次调用
2014-12-20 16:58:19.466 帧动画[11680:60b] duration = 0.016667 , timestamp = 80884.499834 ,第5次调用
2014-12-20 16:58:20.467 帧动画[11680:60b] duration = 0.016667 , timestamp = 80885.500925 ,第6次调用
1.6总结
默认frameInterval=1, 1代表屏幕刷新1次,就调1次方法.改成60,意味着屏幕刷新60次,才调一次方法
调方法前: duration = 0.000000,timestamp = 0.000000,只有调用方法后,这2个属性才有值
无论修改frameInterval数值为多少,duration都不会变,duration代表相邻2次屏幕刷新时间的时间间隔,由苹果控制
timestamp,是CAAnimation的时间格式,格式比较特殊.有点像计算机时间,相对1907.1.1的偏移量.