使用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;
}
}
主要是方法执行顺序,因为会存在时间差
网友评论