7

私はこの構成でiPadにuiviewcontrollerを持っています:

shouldAutorotate (true) supportedInterfaceOrientations (UIInterfaceOrientationMaskAll) 内部でwillRotateToInterfaceOrientationは、インターフェイスを調整するためにいくつかのトリックを実行します。

このコントローラの子から、この -poor- コードを含む QuickLookController を示します。

[[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:previewController animated:YES completion:nil];

しかし、メソッドwillRotateToInterfaceOrientationが呼び出されていないiPadを回転させると、インターフェイスを調整するトリックを行うことができません。

誰かが私に説明したり、アドバイスをくれたりできますか? ありがとう

4

3 に答える 3

13

理由 : この問題には多くの可能性があります。

1) ビューviewControllerがではないsubView他のビューである場合、回転呼び出しがサブビューのコントローラーに伝達されない可能性があります。rootViewControllernavigationController

2)Superメソッドが必要な場所で適切に呼び出されない場合、それが回転の問題の原因である可能性があることをどこかで読みました。つまり、自動回転に関連するビュースタック内のすべての ViewControllers はsuper、メソッド実装でメソッドを呼び出す必要があります (つまり、[super viewDidLoad]ViewController からviewDidLoad)。

以下のトリックを使用して、向きの変更を処理できます。

viewWillAppear にノーティファイアを登録します。

-(void)viewWillAppear:(BOOL)animated{
[[NSNotificationCenter defaultCenter] addObserver:self  selector:@selector(orientationChanged:)  name:UIDeviceOrientationDidChangeNotification  object:nil];}

向きの変更は、以下の関数に通知されます。

- (void)orientationChanged:(NSNotification *)notification{
[self handleOrientation:[[UIApplication sharedApplication] statusBarOrientation]];}

これにより、方向の変更を処理できる以下のメソッドが呼び出されます。

   - (void) handleOrientation:(UIInterfaceOrientation) orientation {

        if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) 
        { 
            //handle the portrait view    
        }
        else if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) 
        {
            //handle the landscape view 
        }
     }
于 2013-01-05T10:02:50.433 に答える
4

アップルのドキュメントで次の段落を見つけました。

回転が発生したときにView Controllerのコンテンツが画面上にない場合、回転メッセージのリストは表示されません。たとえば、次の一連のイベントを考えてみましょう。

  • あなたのView Controllerは、別のView Controllerのコンテンツをフルスクリーンで表示します。
  • ユーザー インターフェイスの向きが変わるように、ユーザーはデバイスを回転させます。
  • アプリは、提示されたビュー コントローラーを閉じます。

この例では、回転が発生したときに表示側のビュー コントローラーが表示されていなかったため、回転イベントを受け取りません。代わりに、再表示されると、そのビューは通常のビュー レイアウト プロセスを使用してサイズ変更および配置されるだけです。レイアウト コードでデバイスの現在の向きを知る必要がある場合は、アプリ オブジェクトの statusBarOrientation プロパティを読み取って現在の向きを判断できます。

それは私の問題を正確に言うので、-(void)viewWillAppear:(BOOL)animated 内にいくつかのロジックを追加して、何かが適切な場所にある場合にレイアウトを調整します。

于 2013-01-05T09:56:18.003 に答える
0

ビュー コントローラーがルート ビュー コントローラーの子として追加されていることを確認してから、メッセージが渡されます。

[rootViewController addChildViewController:viewController];
于 2014-08-14T12:02:38.507 に答える