17

私はiPhoneアプリを持っています。回転の問題があるiOS 6にアップデートしています。私はUITabBarControllerと16 UINavigationCotrollersを持っています。ほとんどのサブビューは縦長または横長で作業できますが、一部は縦長です。 iOS 6では、そうしないといけないことが起こっています。iOS 6 UITabBarController現在のUINavigationコントローラーの向きをサポートしました

私は現在navigationControllerの選択のViewControllerのsupportedInterfaceOrienationsを返すようにtabBarControllerをサブクラス化しようとした:

- (NSUInteger)supportedInterfaceOrientations{ 

    UINavigationController *navController = (UINavigationController *)self.selectedViewController; 
    return [navController.visibleViewController supportedInterfaceOrientations]; 
} 

これは近い私を得ました。ビューコントローラは表示されているときに回転しませんが、私がランドスケープにあり、タブを切り替えると、新しいタブはサポートされていなくてもランドスケープになります。

理想的には、アプリケーションは、現在の表示可能なビューコントローラのサポートされている方向にあることが理想的です。何か案は?

答えて

58

サブクラスあなたUITabBarControllerは、これらのメソッドをオーバーライド:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // You do not need this method if you are not supporting earlier iOS Versions 
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return [self.selectedViewController supportedInterfaceOrientations]; 
} 

-(BOOL)shouldAutorotate 
{ 
    return YES; 
} 

サブクラスあなたUINavigationControllerは、これらのメソッドをオーバーライド:次に

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return [self.topViewController supportedInterfaceOrientations]; 
} 

-(BOOL)shouldAutorotate 
{ 
    return YES; 
} 

あなたが回転したくないあなたのviewControllersでこれらのメソッドを実装:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 

-(BOOL)shouldAutorotate 
{ 
    return NO; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 

そして、回転させたいんviewControllers用:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    { 
     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
    } 

    -(NSUInteger)supportedInterfaceOrientations 
    { 
     return UIInterfaceOrientationMaskAllButUpsideDown; 
    } 

    -(BOOL)shouldAutorotate 
    { 
     return YES; 
    } 

あなたtabbarControllerアプリのウィンドウのRootviewControllerとして追加する必要があります。デフォルトの向きをサポートする予定の場合、upsidedownを除くすべてがiPhoneのデフォルトです。それ以外は何もする必要はありません。逆さまをサポートしたい場合や、別の向きをサポートしたくない場合は、アプリケーションデリゲートやinfo.plistで適切な値を設定する必要があります。

+7

これはほとんど私のために働いています。問題は、私が横になっている場合でも、タブを肖像画に変えてもそれはまだ景観にあるということです。回転する肖像画はそれを修正し、それは景色には戻って回転しませんが、最初にロードするときに肖像画にする必要があります。 – Ryan

+0

私はあなたがそれを回転させるために何をする必要があるのか​​よく分かりませんが、私はあなたがそれを行うと確信しています - (void)viewWillLayoutSubviews。私はメモリからそのメソッド名に正確に当てはまらないかもしれません。このコードを使用した私自身のビューは、回転すると完全に変化しており、そのメソッドを使用して、それらをポートレートモードに再設定します。あなたはまた、何かを試してみるかもしれません - viewWillDisappear。たぶん[self.view setNeedsDisplay]。私は現時点でXcodeではないので、これらはあなたのケースで探求するアイデアです。 –

+0

ニース!魅力的な作品! – Dennso

5

ナビゲーションスタック内の一部のViewコントローラはすべての向きをサポートしていますが、一部のポートレートはUINavigationControllerがアプリのサポートされている向きに戻っていました。この小さなハックが私を助けました。私は、これは行動や何

@implementation UINavigationController (iOS6OrientationFix) 

-(NSUInteger) supportedInterfaceOrientations { 
    return [self.topViewController supportedInterfaceOrientations]; 
} 

@end 
+0

を受け入れることができない 私はありませんそのハックがどのようにして1つのナビゲーションコントローラの異なるビューコントローラで異なる動作をするのに役立つかを理解しています。ヒンジ? –

+1

このコードは、デバイスが方向を変えるたびに実行されるので、uviewcontrollerが現在アクティブであり、現時点で可視であるサポートされている向きを返します – Mindaugas

+0

これは素晴らしい動作です。ありがとう –

3

私は、これはメソッドが実装されていることを保証します(カテゴリ方式など)のようなもの

-(NSUInteger) supportedInterfaceOrientations { 
    if([self.topViewController respondsToSelector:@selector(supportedInterfaceOrientations)]) 
    { 
     return [self.topViewController supportedInterfaceOrientations]; 
    } 
    return UIInterfaceOrientationMaskPortrait; 
} 

優れていると思いを目的としているかはわかりません。このチェックをしておらず、メソッドが実装されていない場合(iOS5のenvのように)、アプリケーションがクラッシュするはずです。

0

すべてのビューコントローラでローテーションを有効または無効にする場合は、UINavigationControllerをサブクラス化する必要はありません。 は、代わりに使用します。あなたのAppDelegate

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

を。あなたが親ビューコントローラ上のすべてのアプリ内の向きが異なる方向(例えばUINavigationControllerスタック)をサポートすることを計画している場合

あなたの親ビューコントローラで、次の方法と組み合わせてAppDelegateから

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

を使用する必要があります。

- (BOOL)shouldAutorotate 

- (NSUInteger)supportedInterfaceOrientations 

しかし、あなたは(私のような)同じナビゲーションスタックに異なるチルドレンViewControllersで異なる向きの設定をするように計画している場合、あなたは、ナビゲーションスタック内の現在のViewControllerをチェックする必要があります。

私は私のUINavigationControllerサブクラスで、次の作成した:

あなたはナビゲーションスタックに現在あるものをビューコントローラインターセプト何とかしなければならない提示ビューコントローラの子どもViewControllers回転設定からもう制御できませんので
- (BOOL)shouldAutorotate 
{ 
    return YES; 
} 

- (NSUInteger)supportedInterfaceOrientations 
{ 
    int interfaceOrientation = 0; 

    if (self.viewControllers.count > 0) 
    { 
     DLog(@"%@", self.viewControllers); 
     for (id viewController in self.viewControllers) 
     { 
      if ([viewController isKindOfClass:([InitialUseViewController class])]) 
      { 
       interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; 
      } 
      else if ([viewController isKindOfClass:([MainViewController class])]) 
      { 
       interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; 
      } 
      else 
      { 
       interfaceOrientation = UIInterfaceOrientationMaskAllButUpsideDown; 
      } 
     } 
    } 
    return interfaceOrientation; 
} 

。それは私がやったことです:)希望が助けてくれる!

関連する問題