2014年6月7日土曜日

CALayerのアニメーションがアプリがバックグラウンドに行った時に削除されてしまう

CALayerに追加したCAAnimationって、アプリがバックグラウンドに行くと削除されてしまうんですね…。
う〜ん、知りませんでした。


cocos2dを使っていれば、CALayerを使うことは殆どないんですけども。メインスレッドを長い時間ブロックしてしまう処理の時に、ちょっと待ってね的なアイコンをアニメーションさせるといった場合、CALayerとCAAnimationの組み合わせが楽なんですね。

で、使っていたら以外な落とし穴があったという。
stack overflowにも書かれてました。

僕のようにちょっとしたアイコンを動かす程度ならまだいいですけど、こういう仕様だと、あまり積極的に使いたくはないですね。

今回、僕のとった対応は、タイマーを仕掛けて、タイマーイベントの中で定期的にCALayerのアニメーションのインスタンスをチェックして、削除されていたら復帰処理をするという感じです。(以下参照)
// タイマー設定
timer = [NSTimer timerWithTimeInterval:0.25 target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

// タイマーイベントメソッド
- (void)updateTimer:(id)info
{
  CAAnimation *anim = [frontLayer animationForKey:@"anim"];
  if (!anim) {
    // アニメーションの再設定処理
                :
  }
}

当然、以前のアニメーションからなんの繋がりも無くなってしまうので、実行しているアニメーションによっては別の対応が必要です。面倒ですね。(´・ω・`)

考えられる方法としては、
applicationWillResignActiveでCALayerに通知
 → 現在の情報を退避
applicationWillEnterForegroundでCALayerに通知
 → 退避した情報を元に復帰
こんな感じでしょうか?

他に良い方法あるかな〜?

関連記事

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...