要は、下記のようなコードを通ったとき。
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 件のコメント:
コメントを投稿