iOS开发iOS DeveloperiOS 开发

CABasicAnimation 旋转动画

2016-03-21  本文已影响1896人  luowanglin

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

     } 

}

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

上一篇下一篇

猜你喜欢

热点阅读