zoukankan      html  css  js  c++  java
  • 暂停、恢复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;
    }
  • 相关阅读:
    关于虚拟机断电导致的 generating /run/initramfs/rdsosreport.txt 问题优秀解决方案
    centos7 yum 阿里源
    startup.bat脚本启动tomcat时,cmd命令窗口闪现问题及Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 错误解决
    Linux 中 Fish Shell
    卸载mysql
    /bin/bash^M: 坏的解释器: 没有那个文件或目录
    elementUI 文本鼠标移入显示太长
    el-upload 手动上传文件
    vue-element-admin 打包测试环境报错
    vue 分页跳转页面详情,返回记住当前点击第几页
  • 原文地址:https://www.cnblogs.com/sunshine-anycall/p/3418685.html
Copyright © 2011-2022 走看看