2012年12月18日火曜日

iPhone開発:Game Centerのリーダーボード表示時とかにおかしなアニメーション

自作iPhoneアプリで、Game Centerのリーダーボードとか、アチーブメントのviewを表示しようとしたとき、画面を回転したときのような変な動きをするようになった。

要は、下記のようなコードを通ったとき。
GKAchievementViewController *achievements = [[GKAchievementViewController alloc] init];
if (achievements != nil)
{
    achievements.achievementDelegate = self;
    [self presentViewController: achievements animated: YES completion:nil];
}

で、animatedをNOにしても効果はないし、そういえばNavigationController下にある他のViewに遷移するときも若干おかしい気がする。

そして6時間くらい調べてやっと原因発見。

ゲーム画面のアニメーションで、開始と終了の組み合わせが合っていない箇所があったのだ。

下記コード
for (int i=0;i<5; i++) {
     // アニメーション定義開始

       [UIView beginAnimations:NULL context:nil];
       [UIView setAnimationDelegate:self];
       [UIView setAnimationDuration:0.1f + (0.05 * i)];
       [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
       ・・・
       ・・
       ・

        }
    }
// アニメーションブロック終了
[UIView commitAnimations];

要は、少しずつタイミングをずらしたアニメーションを複数実行したかったわけで、
for文でアニメーションの時間をずらしていた。

そして、なにを考えていたのか(多分コピペして途中にfor文を差し込んだせいだと思うが)アニメーション定義の終了をfor文の外に出していた。

つまり、上記だとアニメーション定義開始を5回やって、定義終了を1回しかやっていないことになる。

しかもここの処理は正常に5回アニメーションされてしまうようだ。
そして気付かないという結果に・・・。

さらにまずいことに、これはアプリ内の他のViewにまで影響してしまうらしく、
原因を探るのにさらなる時間が必要となってしまった。

ということで、以上が原因となり、Viewの切り替えのところで変なアニメーションが発生していた。
定義終了のところをfor文のなかに入れたところGameCenterのviewも正常に表示された。

アニメーション定義の開始と終了は1対1になるように気をつけましょうというお話でした。

0 件のコメント:

コメントを投稿