2

iOS6shouldAutorotateの奥深くに伝播する正しい方法は何ですかmodal viewcontroller

次の例を考えてみましょう。

  1. Tabbed ApplicationXCode4.5で新しいサンプルを作成します
  2. で、すべての方向Summaryを選択します
  3. 新しいシンプルなものを作成しますUITabBarController。たとえばMyTabBarViewController、コードを追加します

    - (BOOL)shouldAutorotate {
        return YES;
    }
    
    - (NSUInteger)supportedInterfaceOrientations {
        return UIInterfaceOrientationMaskAll;
    }
    
  4. AppDelegateで、回転をフックするためにUITabBarControllerで置き換えますMyTabBarViewController

    self.tabBarController = [[MyTabBarViewController alloc] init];
    
  5. これで回転が機能するはずです。で、クリック時にモーダルFirstViewControllerビューコントローラーを表示するコードを追加します

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
        UIViewController * viewController2 = [[SecondViewController alloc] 
            initWithNibName:@"SecondViewController_iPhone" bundle:nil];
    
        [self presentViewController: [[UINavigationController alloc] 
            initWithRootViewController:viewController2] 
            animated:YES 
            completion:nil];
    }
    

問題:

これで、SecondViewControllerがでラップされているため、SecondViewControllerUINavigationControllerを追加shouldAutorotateしたとしても、逆さまの回転を正しく行うことができません。

唯一の修正は、カスタムを作成してUINavigationController実装することshouldAutorotateであり、これは機能するはずです。

しかし、このアプローチはばかげているように聞こえ、実装してすべてのUIクラスを修正する必要があり、shouldAutorotateなどの省略形を使用できなくなります。[UINavigationController alloc] initWithRootViewController...これらすべてUITabBarControllerとを実装する必要がありUINavigationControllerます。

より良いアプローチはありますか?

4

2 に答える 2

0

それは愚かではありません、そしてそれは正しい方法のようです。UINavigationControllerのサブクラスを作成し、を使用できます [[MyNavigationController alloc] initWithRootViewController:...]

于 2012-10-12T09:50:13.013 に答える
0

これを試しましたか:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:UIDeviceOrientationDidChangeNotification object:nil];

これは、回転についてオブザーバーに通知するデバイスによって送信される通知です。もう必要ないときは、Observerを削除することを忘れないでください

于 2012-10-12T09:50:49.567 に答える