こんにちは。開発担当のICTFです。
iOS6になって、以前画面回転の制御に使っていたshouldAutorotateToInterfaceOrientationはコールされなくなりました。
新たに導入された仕組みを使って画面回転制御を行なう必要がありますが、その方法については既に様々なサイトで紹介されていますので、「紹介通りに実装したのに上手く回転しない!」場合にチェックすべき項目について書こうと思います。
チェックポイント1:
AppDelegateのself.windowにビューをaddSubViewしていませんか?
古いバージョンから存在するプロジェクトをiOS6対応する場合、このような作りになっている可能性があります。
[self.window addSubview:rootViewController.view];
一見画面は正常に表示されますが、この方法では画面回転制御の新しい仕組みが働きません。
もし上記の書き方をしている場合、次のように書き替えて下さい。
self.window.rootViewController = rootViewController;
チェックポイント2:
Info.plistで設定するSupported Interface Orientationsの設定は合っていますか?
以前はあって無いようなものだったこの設定値がiOS6から生きてきます。
ここでデバイスの向きを有効化していないと、いくらコードを弄っても画面は回転してくれませんので注意が必要です。
Info.plistのSupported Interface Orientationsは、プロジェクトマネージャ内でプロジェクトを選択し、Summaryタブを選択する事GUIでの入力が可能です。
上の画像では横方向2種類が選択状態になっています。
チェックポイント3:
AppDelegateのself.window.rootViewControllerにUINavigationControllerを設定していませんか?
もちろんナビゲーションベースのアプリを作る場合にrootViewControllerにUINavigationControllerを設定する事は間違いではありません。
しかしiOS6の仕様として、「UINavigationControllerに追加された子UIViewControllerには画面回転制御のコールバックがされない」というものがあります。
つまり、いくらUIViewControllerに画面回転制御を実装してもコールバックされない為思ったように回転制御が出来ない訳です。
UINavigationControllerのサブクラスを作り、そこに画面回転制御を組み込んでも構いませんし、次のようにUINavigationControllerクラス自体を拡張しても良いかもしれません。
@implementation UINavigationController (Rotation)
- (NSUInteger)supportedInterfaceOrientations{
return [self.viewControllers.lastObject supportedInterfaceOrientations];
}
- (BOOL)shouldAutorotate{
return [self.viewControllers.lastObject shouldAutorotate];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
return [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation];
}
@end
上の例では、回転制御を現在表示中の子画面に渡しています。
こうする事で画面ごとに回転制御を行なう事が可能です。
アプリ内で回転制御を細かく分ける必要がない場合、UINavigationControllerから直接値を返すようにした方が楽かもしれません。
コメントする