読者です 読者をやめる 読者になる 読者になる

pixyzehn blog

iPhone App, Mac App, Programming, Web service, Tool, Evernote, etc

modalViewを使ったUIModalTransitionStyleFlipHorizontalの遷移のあとに起こるステータスバーの高さ分のずれのバグについて

f:id:inagex:20140318092317g:plain

参照: http://stackoverflow.com/questions/18781519/ios7-uimodaltransitionstylefliphorizontal-bounces-after-transition


この現象の解決方法についてです。


この現象はiOS6のときのアプリがiOS7にすると起こるようで、ステータスバーを画面が表示されてから認識してサイズ調整を行っているように思えます。


つまり本来ナビゲーションバーは64pxでありますが、それを44pxと画面が表示された瞬間は認識しておりすぐに64pxに変更され、見た目的にも直さなければいけない挙動です。


この挙動のググり方が最初難しかったのですが。。


stackoverflowにこの現象にどんぴしゃのことが書いてありました。


f:id:inagex:20140318092848p:plain


http://stackoverflow.com/questions/18781519/ios7-uimodaltransitionstylefliphorizontal-bounces-after-transition


ここではNavegationControllerをベースとしたViewControllerをA,BとしてAからBにmodalViewを使ったパターンで遷移させるという状況で説明します。


またUIViewControllerのプロパティmodalTransitionStyleを変更することでアニメーションを変化させることができ、ここではタイトルの通りUIModalTransitionStyleFlipHorizontalを使うと発生するバグなので水平方向に画面がフリップするUIModalTransitionStyleFlipHorizontalを用います。


まずAからBに遷移するときの対処方法としては


Bの実装ファイルに以下のメソッドを追加すると解消するはずです。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [self.navigationController.navigationBar.layer removeAllAnimations];
}


これを追加するとAからBの遷移におけるバグは解消しますが、BからAの遷移つまりmodalでいうとdismissが解消されません。


stackoverflowをみてもdismissには適用されないということが報告されています。


すべてにあてはまる方法ではないかもしれませんが、dismissについてはAの実装ファイルに追加していきます。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [self.navigationController.navigationBar.layer removeAllAnimations];
}

これと

- (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];

    [self.navigationController.navigationBar.layer removeAllAnimations];
}


上記のメソッドを追加するとナビゲーションバーの遷移のあとにがくんとなる現象については直りましたが、ナビゲーションバー以下のView全体がそのような現象となっていたので-(void)viewWillAppear:(BOOL)animatedのメソッドに-(void)viewDidLoadを追加したら直り全体として適切な遷移となりました。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [self viewDidLoad];

    [self.navigationController.navigationBar.layer removeAllAnimations];
}


自分の場合はviewDidLoadにてViewの描写の処理を行っていたのでdismissのあとにそのviewDidLoadの描写をもう一度行うということで解消しました。


日本語での記事はほぼ皆無でしたので参考にしてもらえればと思います。


参考文献


http://stackoverflow.com/questions/18781519/ios7-uimodaltransitionstylefliphorizontal-bounces-after-transition