CABasicAnimation 旋转动画

作者: luowanglin | 来源:发表于2016-03-21 22:26 被阅读1896次

    使用CABasicAnimation 进行旋转动画时,如果进行断续操作,在启动的瞬间,可能会出现旋转卡顿现象,其问题原因 与 相关方法 调用顺序有关。操作如下:

    //旋转动画的实现,其rotaView为自定义UIview对象

    CABasicAnimation *rotation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];

    [rotation setToValue:@(M_PI*2)];

    [rotation setDuration:4];

    [rotation setRepeatCount:MAXFLOAT];

    [rotaView.layer addAnimation:rotation forKey:@"rotation"];

    //通过触摸屏幕执行 旋转&&暂停

    -(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event{

    //MARK:rotation animation 通过speed属性判断其运动状态 0 为暂停 1 为旋转

            if (rotaView.layer.speed == 0) {

    //save timeOffSet value 

            CFTimeInterval recoderTimer = rotaView.layer.timeOffset;//提取暂停时间,点击暂停时保存的当前时间

    //set up spped

            rotaView.layer.speed = 1; //启动旋转

    //reset timeOffSet && beginAnimationTime  恢复清零

            rotaView.layer.beginTime = 0;//beginTime 内部会进行偏移量的计算,真正的开始时间,会是在当前时间的基础上减去 参数值。所以所传的参数,不能是停止动画时记录的时间,而应该是开始动画的当前时间 减去 停止动画时的时间,所获得的 偏移差。

            rotaView.layer.timeOffset = 0;//偏移量清零,第一步的提取操作,就是在这步的基础上,做了保存,以便后续使用

    //caculate between time 计算与当前时间的差值,同时赋值给 beginTime

             rotaView.layer.beginTime = [rotaView.layer convertTime:CACurrentMediaTime() fromLayer:nil] - recoderTimer;

    }else{

    //recoder current time 记录暂停的当前时间,然将speed 属性赋值为0,暂停动画

             rotaView.layer.timeOffset = [rotaView.layer convertTime:CACurrentMediaTime()     fromLayer:nil];

             rotaView.layer.speed = 0;

         } 

    }

    主要是方法执行顺序,因为会存在时间差

    相关文章

      网友评论

        本文标题:CABasicAnimation 旋转动画

        本文链接:https://www.haomeiwen.com/subject/sugklttx.html