6

私のアプリには、マスターコントローラーと詳細コントローラーを備えたカスタムスプリットビューコントローラーがあります。

- (id)initWithMasterController:(UIViewController*)aMasterController
            detailedController:(UIViewController*)aDetailedController;

マスターコントローラーと詳細コントローラーに提供されるコントローラーはUINavigationControllerです。

私のアプリの一部として、オリエンテーション処理には2つのケースが考えられます。

  1. マスターコントローラーと詳細コントローラーでコントローラーの6つの組み合わせを使用すると、アプリですべての方向がサポートされます。
  2. 詳細コントローラのみにStudentDetailsViewControllerがある場合、サポートできる方向は2つだけです。(風景)

デバイスの向きが変更されると、iOS6.0より前のバージョンでは次のことが発生します

  1. -shouldAutorotateToInterfaceOrientation:メソッドが呼び出されます。そのメソッドの実装は次のとおりです。実行時に、同じ呼び出しでマスターコントローラーと詳細コントローラーにリクエストを転送します。

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {   
        BOOL res = [masterController shouldAutorotateToInterfaceOrientation:interfaceOrientation]
                   && [detailedController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
        return res;
    }
    
  2. masterController-shouldAutorotateToInterfaceOrientationはTRUEを返します。StudentViewControllerでのメソッドの実装は以下のとおりです。

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        return (IS_IPAD) ? UIInterfaceOrientationIsLandscape(interfaceOrientation)
                         : UIInterfaceOrientationIsPortrait(interfaceOrientation);
    }
    

変更する新しい方向に関する情報を取得する機能は、回転を有効にするかどうかを決定するのに役立ちます。

iOS 6.0の場合:

デバイスの向きが変更されると、iOS6.0のバージョンで次のことが発生します

  1. 分割ビューコントローラのメソッド-shouldAutorotateが呼び出されます。その実装は以下のとおりです

    - (BOOL)shouldAutorotate {
        BOOL res = [masterController shouldAutorotate]
                   && [detailedController shouldAutorotate];
        return res;
     }
    
  2. 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を返すと、回転が抑制されます。

現在の向きに基づいて自動回転を一時的に無効にすることはできますか?

4

2 に答える 2

0

これは、rootViewController が優先方向について childViewController を参照しない iOS のある種の問題だと思います。ただし、次のようなことを試してください。

 if (self.interfaceOrientation != UIInterfaceOrientationPortrait) 
{
    [[UIDevice currentDevice] performSelector:NSSelectorFromString(@"setOrientation:") withObject:(id)UIInterfaceOrientationPortrait];
}

特定のビューの向きを縦向きに戻します。

于 2012-12-31T01:43:13.727 に答える
0

アプリケーション デリゲート クラスで次のメソッドを定義します。このメソッドは、アプリケーション内の他の回転メソッドより前に呼び出されます。

アプリの向きを決定するフラグ (isRotationEnabled) を作成します。

- (NSUInteger) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {    

return self.isRotationEnabled ?
    UIInterfaceOrientationMaskAll :
    UIInterfaceOrientationMaskPortrait;
}

次のコードを使用して、アプリのさまざまな条件に基づいてこのフラグを変更します

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.isRotationEnabled = NO;
于 2013-05-10T17:10:43.613 に答える