博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
暂停、恢复CALayer 动画
阅读量:7119 次
发布时间:2019-06-28

本文共 2419 字,大约阅读时间需要 8 分钟。

CALayer都是实现了CAMediaTiming协议(或者叫做接口)。所以layer的动画有一个很有意思的属性speed。如果一个layer的动画速度变成0.0的时候,很显然这个动画就不再动了。设置layer的speed为0时,layer的动画暂停。speed属性设置为任意大于0的值时,动画回复。

要暂停一个动画时:

-(void)pauseLayer:(CALayer*)layer {   CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];   layer.speed = 0.0;   layer.timeOffset = pausedTime;}

恢复一个动画:

-(void)resumeLayer:(CALayer*)layer {   CFTimeInterval pausedTime = [layer timeOffset];   layer.speed = 1.0;   layer.timeOffset = 0.0;   layer.beginTime = 0.0;   CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;   layer.beginTime = timeSincePause;}

比如你有这么一个在ImageView上执行的动画,你想让这个动画开始执行后点击按钮暂停,在点击按钮恢复就可以这样:

CABasicAnimation *sizeAnim = [CABasicAnimation animationWithKeyPath:@"transform"];        sizeAnim.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];        sizeAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1.5f, 1.5f, 1.f)];        sizeAnim.duration = .2f;        sizeAnim.fillMode = kCAFillModeForwards;        sizeAnim.removedOnCompletion = YES;        sizeAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];        [self.collectionImageView.layer addAnimation:sizeAnim forKey:@"size"];                CAKeyframeAnimation *shakeAnim = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];        shakeAnim.values = @[@(M_PI/6), @(-M_PI/6),@(M_PI/6)/*, @(-M_PI/6)*/];        shakeAnim.timingFunctions = @[[self getTiming:kCAMediaTimingFunctionLinear]                                      , [self getTiming:kCAMediaTimingFunctionLinear]                                      ,[self getTiming:kCAMediaTimingFunctionLinear]];        shakeAnim.duration = .2f;//        shakeAnim.beginTime = CACurrentMediaTime() + sizeAnim.duration;        [self.collectionImageView.layer addAnimation:shakeAnim forKey:@"shake"];

上面说的ImageView可以通过self.collectionImageView来访问。这里设置的执行时间都不是很长,在实验的时候最好把动画的执行时间设置的长点。

暂停&恢复的代码:

static BOOL animationStoped = NO;- (IBAction)animationAction:(id)sender {    if (!animationStoped) {        [self pauseLayer:self.collectionImageView.layer];//        animationStoped = YES;    }    else{        [self resumeLayer:self.collectionImageView.layer];    }    animationStoped = !animationStoped;}

 

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 330987132 | Go:217696290 | Python:336880185 | 做人要厚道,转载请注明出处!
你可能感兴趣的文章
第二章 例题2-11
查看>>
系统参数递归
查看>>
tomcat详细日志配置
查看>>
Docker学习笔记1
查看>>
字符编码-Unicode等
查看>>
mind map in latex
查看>>
郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(三)SVD...
查看>>
log4j整理
查看>>
Oracle Tuning ( instance 级别 ) 01
查看>>
HTML 5 画布
查看>>
# 20155224 实验四 Android程序设计
查看>>
ARP 协议 理解
查看>>
Allow windows service to "Interact with desktop"
查看>>
InitGoogleLogging坑爹
查看>>
SQL 查询间隔时间大于60s的所有数据
查看>>
*ecshop 限制文章帮助文章显示条数
查看>>
使用phpStudyy运行tipask
查看>>
c# 常用函数
查看>>
网络TCp数据的传输设计(黏包处理)
查看>>
C++ Custom Control控件 向父窗体发送对应的消息
查看>>