1

私はiosで自動回転の実装について混乱しています。
私はUIViewControllerを持っており、それをshouldAutoRotateToInterfaceOrientation内で自動回転するように指示します。ただし、動作しません。 これは、すべての種類の混乱(手を挙げる)を引き起こすことが知られているため、ナビゲーションスタックと/またはUITabBarControllerが使用されたかどうかを調べる方法について何かを読んでいます。ios5での自動回転 - 失敗する最も一般的な理由

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

なぜ、現在のUIViewController内でshouldAutoRotateToInterfaceOrientationが返すものによってのみ自動回転が決定されないのですか?

に位置リンゴの技術ドキュメントから:あなたのUITabBarControllerやUINavigationControllerのすべての子ビューコントローラは、共通の方向に同意しない

:あなたはそれを期待するときのUIViewControllerのに回転しない理由についてhttps://developer.apple.com/library/ios/#qa/qa2010/qa1688.htmlセット。あなたはそれぞれのタブやナビゲーションのレベルを表す各 ビューコントローラのshouldAutorotateToInterfaceOrientationを実装する必要があります

は、すべてのあなたの子供のビューコントローラが正しく回転していることを確認します。その回転が発生するのと同じ向きでそれぞれ が一致しなければなりません。つまり、 は、すべて同じ向きの位置に対してYESを返す必要があります。

UITabBarsとUINavigationControllersを使用する際に注意すべき事実を要約できますか?人々は一般的にどこが混乱しているのですか、何か厄介な点は何ですか?

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

私は失敗の一般的な理由は、自動回転に適用されるので十分にレスポンダーチェーンを理解していないと思うと思う。もしそうなら、誰かが私のためにこれをクリアすることができますか?次に、私は「選択的な自動回転」を理解することができるかもしれません。

これを追加するには、UITabBarControllerをサブクラス化してshouldAutorotateToInterfaceOrientationを上書きする必要があることを示す他の投稿があります。 UITabBarControllerやUINavigationControllerに接続

答えて

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 

} 
1

私の2セント... UIViewControllersが提示し

ビューは、静的な、しかし動のではありません。私はあなたがおそらくあなたの意見を切り替えるつもりだと考える必要があることを意味します。それらのいくつかが回転していて、そうでないものがあれば、あなたのGUIは面倒です。少なくともAppleの意見です。

0

私は同じ問題に遭遇してきたが、このソリューションが役立つことを願っ他、

iOS 5以下

実装カテゴリUINavigationControllersタブに関連付けられている場合に処理する:

@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復帰によって決定今一度このカテゴリが実装されている自動回転を

関連する問題