1

iOS での自動回転の実装について混乱しています。
UIViewController があり、shouldAutoRotateToInterfaceOrientation 内で自動回転するように指示します。しかし、うまくいきません。そこで、ナビゲーション スタックをどのように確認する必要があるか、および/または UITabBarController が使用されているかどうかについて何かを読みました。これは、あらゆる種類の混乱を引き起こすことが知られているためです (挙手)。

実際、私は UITabBar と UINavigationController を持っています。回転させたい UIView は、3 つまたは 4 つの「レベル」の深さのスタックにプッシュされています。

現在の UIViewController 内で shouldAutoRotateToInterfaceOrientation が返すものだけで自動回転が決定されないのはなぜですか?

https://developer.apple.com/library/ios/#qa/qa2010/qa1688.htmlにある Appleのテクニカル ドキュメントから 、UIViewController が期待どおりに回転しない理由について:

UITabBarController または UINavigationController 内のすべての子ビュー コントローラーが、共通の方向セットに同意していません。

すべての子ビュー コントローラーが正しく回転するようにするには、各タブまたはナビゲーション レベルを表すビュー コントローラーごとに shouldAutorotateToInterfaceOrientation を実装する必要があります。その回転が発生するには、それぞれが同じ方向に同意する必要があります。つまり、それらはすべて、同じ向きの位置に対して YES を返す必要があります。

UITabBars と UINavigationControllers を使用するときに知っておく必要がある事実を誰か要約できますか? 人々はどこをよく間違えますか、または濁りのポイントは何ですか?

UITabBar、UITabBarController、または UINavigationController がある場合、その子ビューはすべて同じ自動回転動作を持つ必要があります。しかし、確かに、いくつかの子ビューを回転させ、他のビューを回転させないようにすることはできますよね?

失敗の一般的な理由は、オートローテーションに適用されるレスポンダー チェーンを十分に理解していないことに関係していると思われます。もしそうなら、誰かが私のためにこれを片付けることができますか? それから、「選択的オートローテーション」を理解できるかもしれません。

これに追加するには、UITabBarController をサブクラス化し、shouldAutorotateToInterfaceOrientation をオーバーライドする必要があることを他の投稿が示しています。

4

3 に答える 3

2

全員に同じように応答してもらいたいのは、ユーザーにとって扱いにくいからだと思います。回転できる特別なビューで横向きモードになっている場合、そのビューコントローラーをナビゲーションコントローラーの親にポップしたり、横向きモードを持たないタブをタップしたりすると、奇妙な体験になります。

そこが理屈だと思います。

ただし、デバイスの向きの通知をキャッチして、必要に応じて自分で処理し、回転させたい特定のビューでデバイスが回転した場合に新しいビューをプッシュすることができます。

これを使って:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(rotationDetected) name:@"UIDeviceOrientationDidChangeNotification" object:nil];

rotationDetected次に、回転したときに何が起こるかを処理する関数を作成します...次のように:

-(void) rotationDetected {

    if (([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft) || ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight)){

    //Push on the view in landscape orientation if we aren't there already

} else if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown) {

    //If the landscape view is present, pop it back to the portait view  

}
于 2012-04-12T21:32:27.900 に答える
1

私の2セント...

UITabBarController および UINavigationController に接続されている場合、UIViewControllers によって提示されるビューは、静的ではなく動的です。ユーザーがおそらくあなたのビューを切り替えるだろうと考えなければならないということです。それらの一部が回転し、一部が回転しない場合、GUI は乱雑になるはずです。少なくとも、Apple の意見ではそうです。

于 2012-04-12T21:27:31.083 に答える
0

この解決策が他の人に役立つことを願って、同じ問題に遭遇しました。

iOS 5 以下の場合、

UINavigationControllersが tabに関連付けられている ケースを処理するための カテゴリを実装します

@implementation UITabBarController (AutoRotation)

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

 {
          if ([self.selectedViewController isKindOfClass:[UINavigationController class]]) 

          {
              UIViewController *rootController = [((UINavigationController *)self.selectedViewController).viewControllers lastObject];
             return [rootController shouldAutorotateToInterfaceOrientation:interfaceOrientation];

          }
         return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];

  }

@end

このカテゴリが実装されると、現在の UIViewController 内で shouldAutoRotateToInterfaceOrientation が返すものによってのみ決定される自動回転

于 2013-08-20T16:08:17.590 に答える