執(zhí)行動畫過程中暫停和繼續(xù)上次動畫的狀態(tài)繼續(xù)執(zhí)行動畫,需要用到layer.speed 和 layer.timeOffset, layer.beginTime.
基本做法就是記錄暫停時的動畫時間着降,然后繼續(xù)動畫時將開始時間設置為上次暫停的時間渐尿。下面是個旋轉動畫的暫停和繼續(xù)吼畏。
-(void)startAnimating
{
//先判斷是否已設置動畫朦蕴,如果已設置則執(zhí)行動畫
if([_coverImageView.layer animationForKey:@"rotatianAnimKey"]){
//如果動畫正在執(zhí)行則返回,避免重復執(zhí)行動畫
if (_coverImageView.layer.speed == 1) {
//speed == 1表示動畫正在執(zhí)行
return;
}
//讓動畫執(zhí)行
_coverImageView.layer.speed = 1;
//取消上次設置的時間
_coverImageView.layer.beginTime = 0;
//獲取上次動畫停留的時刻
CFTimeInterval pauseTime = _coverImageView.layer.timeOffset;
//取消上次記錄的停留時刻
_coverImageView.layer.timeOffset = 0;
//計算暫停的時間瘟芝,設置相對于父坐標系的開始時間
_coverImageView.layer.beginTime = [_coverImageView.layer convertTime:CACurrentMediaTime() fromLayer:nil] - pauseTime;
}else{//沒有設置動畫
//添加動畫
[self addAnimation];
}
}
-(void)addAnimation
{
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];//rotation.z
//默認是順時針效果遥昧,若將fromValue和toValue的值互換覆醇,則為逆時針效果
animation.toValue = [NSNumber numberWithFloat: M_PI *2];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
animation.duration = 40;//執(zhí)行一周40秒
animation.autoreverses = NO;
animation.cumulative = NO;
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
animation.repeatCount = FLT_MAX; //如果這里想設置成一直自旋轉,可以設置為FLT_MAX炭臭,
[_coverImageView.layer addAnimation:animation forKey:@"rotatianAnimKey"];
//添加動畫之后永脓,再讓動畫執(zhí)行,否則可能出現(xiàn)動畫不執(zhí)行的情況
[self startAnimating];
}
-(void)stopAnimating
{
//如果動畫已經暫停鞋仍,則返回常摧,避免重復,時間會記錄錯誤威创,造成動畫繼續(xù)后不能連續(xù)落午。
if (_coverImageView.layer.speed == 0) {
return;
}
//將當前動畫執(zhí)行到的時間保存到layer的timeOffet中
//一定要先獲取時間再暫停動畫
CFTimeInterval pausedTime = [_coverImageView.layer convertTime:CACurrentMediaTime() fromLayer:nil];
//將動畫暫停
_coverImageView.layer.speed = 0;
//記錄動畫暫停時間
_coverImageView.layer.timeOffset = pausedTime;
}