屏幕刷新動(dòng)畫(huà)-CADisplayLink
CADisplayLink
是一定時(shí)器對(duì)象阴孟,相對(duì)NSTimer
的不同之處在于,CADisplayLink
是根據(jù)屏幕的刷新頻率來(lái)實(shí)現(xiàn)的一個(gè)定時(shí)器。iOS設(shè)備是每秒刷新60次蛤虐,意味著CADisplayLink
開(kāi)啟后,每秒也將執(zhí)行60次。CADisplayLink
的selector
調(diào)用時(shí)機(jī)是在屏幕刷新結(jié)束后局雄。
CADisplayLink與NSTimer區(qū)別
-
CADisplayLink
是屏幕刷新結(jié)束后調(diào)用的,相對(duì)于NSTimer
來(lái)說(shuō)精度更高存炮,因?yàn)樵?code>RunLoop出現(xiàn)阻塞的情況下NSTimer
的精度有所下降炬搭。主要跟RunLoop
的周期有關(guān)。 -
CADisplayLink
是基于屏幕刷新的穆桂,更適合做UI不停繪制的工作宫盔。
CADisplayLink常用屬性
//上一幀的時(shí)間
@property(readonly, nonatomic) CFTimeInterval timestamp;
//屏幕時(shí)兩幀之間的時(shí)間間隔
@property(readonly, nonatomic) CFTimeInterval duration;
//下一幀的時(shí)間
@property(readonly, nonatomic) CFTimeInterval targetTimestamp;
//是否暫停
@property(getter=isPaused, nonatomic) BOOL paused;
//已過(guò)時(shí)
@property(nonatomic) NSInteger frameInterval;
//每秒多少幀
@property(nonatomic) NSInteger preferredFramesPerSecond;
創(chuàng)建CADisplayLink
通過(guò)調(diào)用CADisplayLink
的displayLinkWithTarget可以創(chuàng)建一個(gè)CADisplayLink
對(duì)象,然后再通過(guò)調(diào)用addToRunLoop
將定時(shí)器添加到runloop
中啟動(dòng)定時(shí)器享完,可以設(shè)置preferredFramesPerSecond
來(lái)指定每秒執(zhí)行多少次灼芭。
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateTimer)];
//每秒執(zhí)行一次
self.displayLink.preferredFramesPerSecond = 1;
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
CADisplayLink示例
下面通過(guò)使用CADisplayLink
和CAShapeLayer
來(lái)實(shí)現(xiàn)一個(gè)圓形進(jìn)度條的動(dòng)畫(huà)。
- 首先用
CAShapeLayer
和UIBezierPath
來(lái)創(chuàng)建一個(gè)灰色的圓形作為背景驼侠,如下所示:
CGPoint point = CGPointMake(self.animationView.frame.size.width/2, self.animationView.frame.size.height/2);
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:point radius:80 startAngle:0 endAngle:360 clockwise:YES];
CAShapeLayer *layer = [CAShapeLayer layer];
layer.lineWidth = 5;
layer.strokeColor = [UIColor grayColor].CGColor;
layer.fillColor = nil;
layer.path = path.CGPath;
[self.animationView.layer addSublayer:layer];
- 同理再創(chuàng)建一個(gè)用于顯示動(dòng)畫(huà)的紅色圓形姿鸿,如下所示:
CAShapeLayer *layer = [CAShapeLayer layer];
layer.lineWidth = 5;
layer.strokeColor = [UIColor redColor].CGColor;
layer.fillColor = nil;
[self.animationView.layer addSublayer:layer];
self.progressLayer = layer;
- 調(diào)用
CADisplayLink
的回調(diào)不停的添加弧度谆吴,如下所示:
-(void)updateTimer{
if(self.startAngle >= 360){
self.displayLink.paused = YES;
}
CGPoint point = CGPointMake(self.animationView.frame.size.width/2, self.animationView.frame.size.height/2);
[self.progressPath addArcWithCenter:point radius:80 startAngle:(M_PI /180.0) *_startAngle endAngle:(M_PI /180.0) *(_startAngle + 3.6) clockwise:YES];
self.progressLayer.path = self.progressPath.CGPath;
self.startAngle += 3.6;
}
具體的代碼可以在demo中的 MLDisplayLinkViewController
進(jìn)行查看
個(gè)人博客