私のアプリには、マスターコントローラーと詳細コントローラーを備えたカスタムスプリットビューコントローラーがあります。
- (id)initWithMasterController:(UIViewController*)aMasterController
detailedController:(UIViewController*)aDetailedController;
マスターコントローラーと詳細コントローラーに提供されるコントローラーはUINavigationControllerです。
私のアプリの一部として、オリエンテーション処理には2つのケースが考えられます。
- マスターコントローラーと詳細コントローラーでコントローラーの6つの組み合わせを使用すると、アプリですべての方向がサポートされます。
- 詳細コントローラのみにStudentDetailsViewControllerがある場合、サポートできる方向は2つだけです。(風景)
デバイスの向きが変更されると、iOS6.0より前のバージョンでは次のことが発生します
-shouldAutorotateToInterfaceOrientation:
メソッドが呼び出されます。そのメソッドの実装は次のとおりです。実行時に、同じ呼び出しでマスターコントローラーと詳細コントローラーにリクエストを転送します。- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { BOOL res = [masterController shouldAutorotateToInterfaceOrientation:interfaceOrientation] && [detailedController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; return res; }
masterController
-shouldAutorotateToInterfaceOrientation
はTRUEを返します。StudentViewControllerでのメソッドの実装は以下のとおりです。- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (IS_IPAD) ? UIInterfaceOrientationIsLandscape(interfaceOrientation) : UIInterfaceOrientationIsPortrait(interfaceOrientation); }
変更する新しい方向に関する情報を取得する機能は、回転を有効にするかどうかを決定するのに役立ちます。
iOS 6.0の場合:
デバイスの向きが変更されると、iOS6.0のバージョンで次のことが発生します
分割ビューコントローラのメソッド
-shouldAutorotate
が呼び出されます。その実装は以下のとおりです- (BOOL)shouldAutorotate { BOOL res = [masterController shouldAutorotate] && [detailedController shouldAutorotate]; return res; }
detailsControllerのshouldAutorotateはnavigationControllerを呼び出します。StudentControllerでの自動回転機能の実装:
- (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { return (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight); }
しかし、iOS 6.0では、向きを制御できません。supportedInterfaceOrientationsメソッドが呼び出されても、StudentsDetailsControllerのshouldAutorotateメソッドが呼び出されると、detailsControllerのshouldAutorotateメソッドから、shouldAutorotateMethodはsupportedInterfaceOrientationsメソッドに記載されているオプションに従いません。
アップデート:
ドキュメントを読みました。以下のメモがドキュメントに記載されています。
自動回転を動的に無効にしたい場合があります。たとえば、短時間で回転を完全に抑制したい場合にこれを行うことができます。ステータスバーの位置を手動で制御する方向の変更を一時的に無効にする必要があります(setStatusBarOrientation:animated:メソッドを呼び出す場合など)。
自動回転を一時的に無効にする場合は、方向マスクを操作してこれを行うことは避けてください。代わりに、最上位のViewControllerでshouldAutorotateメソッドをオーバーライドします。このメソッドは、自動回転を実行する前に呼び出されます。NOを返すと、回転が抑制されます。
現在の向きに基づいて自動回転を一時的に無効にすることはできますか?