※本記事は、旧ブログからの再掲です。
UINavigationControllerとUITabBarControllerの両方を使用している場合の回転制御についてです。
※iOS6.0以降
iOS6.0からshouldAutorotateToInterfaceOrientation:メソッドがdeprecatedとなり、
新しく下記3つのメソッドが追加されました。
・shouldAutorotate
・supportedInterfaceOrientations
・preferredInterfaceOrientationForPresentation
画面回転を検出すると、まずshouldAutorotateメソッドが呼ばれ、
回転に対応する場合にはYES、しない場合にはNOを返却します。
shouldAutorotateでYESの場合に、supportedInterfaceOrientationsメソッドが呼ばれ、どの向きに対応するかを返却します。
preferredInterfaceOrientationForPresentationメソッドでは、複数の向きに対応している場合に初期表示画面の向きを指定します。
UITabBarControllerとUINavigationControllerを使用している場合、
iOS6.0以降では回転を検出すると、UITabBarControllerに通知が来ます。
そのため、各ビューで回転するかどうかを制御したい場合には、
その配下のビューへ通知し結果を受け取るようにします。
UITabBarControllerとUINavigationControllerはサブクラス化してオーバーライドする方法とカテゴリを追加する方法があります。
今回はカテゴリを追加する方法です。
■UITabBarControllerクラスにカテゴリ(AutoRotate)を追加
selectedViewControllerプロパティより、現在選択されているタブアイテムのコントローラーが取得できます。
そのコントローラーの指定に従います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@implementation UITabBarController (AutoRotate) - (BOOL)shouldAutorotate { return [self.selectedViewController shouldAutorotate]; } - (NSUInteger)supportedInterfaceOrientations { return [self.selectedViewController supportedInterfaceOrientations]; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return [self.selectedViewController preferredInterfaceOrientationForPresentation]; } @end |
■UINavigationControllerクラスにカテゴリ(AutoRotate)を追加
visibleViewControllerプロパティより、現在表示されているビューを取得できます。
そのビューの指定に従います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@implementation UINavigationController (AutoRotate) - (BOOL)shouldAutorotate { return [self.visibleViewController shouldAutorotate]; } - (NSUInteger)supportedInterfaceOrientations { return [self.visibleViewController supportedInterfaceOrientations]; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return [self.visibleViewController preferredInterfaceOrientationForPresentation]; } @end |
■UINavigationController配下のビュー
各ビューコントローラで画面回転に対応するか否か、どの向きに対応するかを指定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/* * 画面回転可否 */ - (BOOL)shouldAutorotate { return YES; } /* * 画面回転をサポートする向き */ - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } /* * 初期表示の画面向き */ - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationPortrait; } |