知道問題的原因之后就能用最簡單的方式解決!
比如下面這段代碼用來給imgV來設置轉(zhuǎn)圈動畫
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
// animation.delegate = self;
// 1秒后執(zhí)行
animation.beginTime = CACurrentMediaTime() + .25;
// 持續(xù)時間
animation.duration = 2.5;
// 重復次數(shù)
animation.repeatCount = MAXFLOAT;
// 起始角度
animation.fromValue = @(0.0);
// 終止角度
animation.toValue = @(2 * M_PI);
// 添加動畫
[imgV.layer addAnimation:animation forKey:@"rotate"];
在按下home鍵進入后臺,再次打開時,動畫暫停了,剛剛轉(zhuǎn)圈旋轉(zhuǎn)的imgV停止在初始的位置。監(jiān)聽系統(tǒng)的UIApplicationDidBecomeActiveNotification ,在通知回調(diào)的方法里面打印信息可以推理動畫CABasicAnimation已經(jīng)被移除了
[imgV.layer animationForKey:@"transform.rotation.z"] -> (null) // 獲取到的值為null
查找CABasicAnimation及其父類對象中有對動畫移除相關的的屬性,定位到其中的屬性removedOnCompletion,默認為YES,將這個屬性設置為NO后運行,問題就解決了。
animation.removedOnCompletion = NO;
// 顯然這比網(wǎng)上的做法:監(jiān)聽UIApplicationDidBecomeActiveNotification在通知里面重新開始動畫簡單多了
由此可知是程序進入后臺之后,動畫被認為是Completion了,而這個屬性的值為YES時,動畫被移除了。