まいったまいった。複数のアニメーションが終了したら、◯◯するっていう処理を、CATransaction setCompletionBlock に頼ってました。
アニメーション中に停止させると賢いものでアニメーションが終了するまで、completionBlockは実行されないのだ。めでたいめでたい。
が、しかし、アニメーション停止中に、ホームボタンを押してみたら、completionBlockが実行されてもたぁ。しかも、アニメーションは終了してないから、復帰後停止をを解除したら、アニメーションが再開される。そして、そのアニメーションが終わっても、completionBlockが再度実行されることはありませんでした。
これで、もう使えないのは確定です。でも、きっと、これはバグのはず。ってか、もうiOSってバージョン7だよ。なので、きっと仕様だ。いやバグだ。なぜバグだと思うかというとログがそう判断させる。
「おわったーーーーーーー」が CATransaction completionBlock で実行される部分です。
1 2 3 4 5 6 7 8 9 10 11 12 |
19:28:05.149 -[AppDelegate applicationDidBecomeActive:] 19:28:08.755 -[AppDelegate applicationWillResignActive:] 19:28:08.767 -[ViewController appWillResignActive:] 19:28:08.781 ホームボタン一回 19:28:08.787 -[AppDelegate applicationDidEnterBackground:] 19:28:08.789 -[ViewController appDidEnterBackground:] 19:28:08.791 サスペンド 19:28:08.898 おわったーーーーーーー 19:28:10.695 -[AppDelegate applicationWillEnterForeground:] 19:28:10.701 -[ViewController appWillEnterForeground:] 19:28:10.704 復帰 19:28:10.706 -[AppDelegate applicationDidBecomeActive:] |
「おわったーーーーーーー」が「サスペンド」の後にあります。
「サスペンド」は「Background」にうつるための処理の最後に記述していますので、この文字より後は、バックグラウンドで動いています。時間にしたらアプリが裏に回ってから0.1秒後に CATransaction completionBlock が実行されたことになりますね。スレッドが悪さしてるのかなぁ。
全くどうしたらよいものか。解決方法をご存じの方がいましたら教えていただければ幸いです。私の今の力量では無理っぽいので、CATransaction setCompletionBlock を書き換える方向で対応します。
追記:
CAAnimetion の animationDidStop:finished: でも同じ現象を確認できました。animationDidStop:finished: を再度呼び出す方法を模索していますが今のところ見あたっていません。
さらに追記:
対策してしては、フォアグランドで復帰した時に、再度アニメーションを登録し直すことで、対応するしかなさそうです。
その場合は2種類の方法があるかと思います。
1つ目はバックグラウンドに入る時にアニメーションを全て破棄して、フォアグランドに戻った時にはアニメーションをはじめからやり直す。
2つ目はバックグラウンドに入る時のアニメーションの途中経過を覚えてから破棄し、フォアグランドに戻った時にそれらの情報を元にして、新しいアニメションを生成して実行する。
どっちにしても、はじめから構造をしっかり考えて作っておかないと手間のかかる作業ですね。
アニメーションの途中に計算式を極力挟まないようにしながらプログラムを構築してく癖が必要です。
さらさらに追記:
今回、自分がとった解決方法は、連続するアニメーションだったので、ポーズという概念を捨てて、各アニメーションの開始タイミングで、Stopフラグのチェックをしてフラグが立っていれば、Scene番号を覚えておいて、リスタート時に反映させるようにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
- (void)startAnimetion{ animeScene = 0; [scoreSeqClass startChangeImageAnime:0.6f endTarget:self endSelector:@selector(scene10)]; } - (void)scene10 { animeScene = 1; if (animeStop == NO) { [lvupSeqClass startChangeImageAnime:0.6f endTarget:self endSelector:@selector(scene20)]; } } - (void)scene20 { animeScene = 2; if (animeStop == NO) { [CongSeqClass startChangeImageAnime:0.6f endTarget:self endSelector:@selector(endAnime)]; } } - (void)endAnime { animeScene = 0; animeStop = NO; } - (void)stopAnime { animeStop = YES; } - (void)restartAnime { animeStop = NO; if (animeScene == 1) { [lvupSeqClass startChangeImageAnime:0.6f endTarget:self endSelector:@selector(scene20)]; } if (animeScene == 2) { [CongSeqClass startChangeImageAnime:0.6f endTarget:self endSelector:@selector(endAnime)]; } } |
おわり。
コメント