2012年11月13日火曜日

iOS6非互換:画面回転について

iOS6になって画面回転挙動の違いやコーディング方法等、結構違いがあるようでコード修正が必要になります。 いまさらコアな部分は変更して欲しくないってのが正直なところですがアップルは良いと思ったら「スパッ」と変更してきますので追従するのが結構大変です。

いろんな方々がブログ等で相違点・対応策を公開されており、それらを参考に調べておりましたが少しはまってしまった点がありましたので記載したいと思います。

<相違点>
・画面向きの変更通知用に下記メソッドですがiOS5まではビューコントローラ生成時向きの変更が無くても呼び出されていましたが、iOS6では呼び出されないようになったようです。

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration


メソッドの意味合いからすると画面向きが変更になっていないので呼び出されないのが正解かも知れませんが以前まではビューコントローラ生成時に呼び出されていたのでこのメソッド内で画面の方向を取得していました。

iOS6では呼び出されないので別の方法で現在のデバイス向きを取得する必要がありますが、以下のメソッドでは上手く取得できないケースがあります。

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

で、代わりの方法として以下のメソッドで現在のデバイス向きを取得できるようですのでこのメソッドにてデバイス方向の初期値を設定するよう修正したところ正常な動作を実現できました。

UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];


メソッドの呼び出しタイミングとか呼び出し条件の変更等の非互換はテストでも見つけにくいバグ発生の原因になりますから勘弁して欲しいってのが正直なところですね。

<追加したコード>
- (void)viewDidLoad {
// 親クラスメソッド呼び出し
    [super viewDidLoad];
    
    // 現在のデバイス方向の取得
    UIInterfaceOrientation orientation = 
            [[UIApplication sharedApplicationstatusBarOrientation];
    [self willRotateToInterfaceOrientation:orientation duration:0];
}

0 件のコメント:

コメントを投稿