CABasicAnimation 旋转动画

使用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;

     } 

}

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,586评论 6 30
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 5,152评论 5 13
  • Core Animation Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,...
    45b645c5912e阅读 3,077评论 0 21
  • 在iOS实际开发中常用的动画无非是以下四种:UIView动画,核心动画,帧动画,自定义转场动画。 1.UIView...
    请叫我周小帅阅读 3,179评论 1 23
  • 好久未画,今天画一位漫画美女,有点芭比公主的感觉。 线稿 线稿肩宽比例有问题,后来做了修改。
    小鱼素素阅读 453评论 2 2