暂停、恢复CALayer 动画

简介:

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: 572064792 | Nodejs:329118122 做人要厚道,转载请注明出处!














本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/p/3418685.html ,如需转载请自行联系原作者

相关文章
|
22天前
|
存储 API 图形学
Unity 给Animator动画添加事件(动态的)
在 Unity 中,通过动画事件系统可在动画播放的特定时间点触发自定义函数。动态添加事件的步骤包括获取 `AnimationClip` 对象,创建并添加 `AnimationEvent`,最后调用 `Rebind()` 更新动画控制器。示例代码展示了如何在动画开始、中间和结束时触发事件,实现与游戏逻辑的交互。
|
5月前
ThreeJs手动控制动画播放与暂停
这篇文章介绍了如何在Three.js中手动控制动画的播放与暂停,包括设置动画混合器、监听按键事件以调整动画状态和速度的方法。
136 0
ThreeJs手动控制动画播放与暂停
|
10月前
UIView的animateWithDuration动画不执行问题
UIView的animateWithDuration动画不执行问题
141 1
|
C++
Qt图片定时滚动播放器+透明过渡动画
解决:[QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine == 0, type: 1] 需要在哪个控件上绘制,就要在哪个控件类中重写 paintEvent() ,所以本项目 需要使用自定义的MyQLabel继承QLabel
189 0
|
10月前
|
前端开发
css 动画播放暂停
css 动画播放暂停
84 0
|
JavaScript 前端开发
video设置播放时间点及常用属性和方法
video设置播放时间点及常用属性和方法
【Three.js入门】处理动画、尺寸自适应、双击进入/退出全屏(Clock跟踪时间,Gsap动画库,自适应画面,进入/退出全屏)
【Three.js入门】处理动画、尺寸自适应、双击进入/退出全屏(Clock跟踪时间,Gsap动画库,自适应画面,进入/退出全屏)
183 0
|
JavaScript 前端开发
一个按钮控制定时器的开始与暂停
一个按钮控制定时器的开始与暂停
一个按钮控制定时器的开始与暂停
|
XML 图形学 数据格式
Animation组合动画踩坑-实现循环播放动画,可控制次数
Animation组合动画踩坑-实现循环播放动画,可控制次数