2012-03-14 9 views
0

UITabBarControllerのサブクラスを作成して、ポートレートやその他の風景になるようにビューを必要とするため、ビューのautoRotationを処理しました。UITabBarControllerビューを切り替えるときに強制的に回転する

このデバイスを回転させると、これはすべて正常に動作します。そのため、ランドスケープのランドスケープはランドスケープになり、そのままになります。私が持っている問題は、ビューが表示されているときに回転が自動的に実行されないということです。したがって、ランドスケープであることが意図されているビューは、デバイスがランドスケープに回転するまで、ポートレートとして表示され、その時点でランドスケープモードにロックされます。

ビューの切り替え時に回転を強制する方法を誰かが教えてくれるのだろうかと思っていたので、横向きのビューに切り替えると、その向きにまっすぐ回転しますか?

申し訳ありませんこれまでに数百万回も依頼されていますが、スレッドを見つけることができません。

EDITは、私は次のコードを発見した:

UIViewController *c = [[UIViewController alloc]init]; 
[self presentModalViewController:c animated:NO]; 
[self dismissModalViewControllerAnimated:NO]; 
[c release]; 

これは回転を行わないと、私はタブバーコントローラのようなものを呼び出さないようにそれを呼び出すことがどこか分かりませんinit/viewDidLoad、明らかにviewDidAppearなどに配置すると、無限ループが発生します。

お願いします。

答えて

3

私は自分の問題の解決策を思いつき、他の人が望むようにここに投稿します。私はあなたにそれが回避策であることを警告しますが、答えを見つけることができなかったので、私ができることは最高でした。

ので、次の手順を実行します。まず、TabBarControllerが作成されているあなたのプロトコルにUITabBarControllerDelegateを追加し、私はAppDelegateを使用しています:

@interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate> 

これは、次のTabBarプロトコルへのアクセスを許可します。

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 

これは基本的に、TabBarItemsの1つが押されたときに呼び出されます(下部にあるボタン)。この関数内では、viewControllerNibFileの名前を抽出します(命名規則を心配したくない場合はおそらくview.tagを使用できます)。次のように通知センターにイベントを投稿します。 :

NSString *notificationName; 

if ([viewController.nibName isEqualToString:@"IntroViewController"]) 
    notificationName = [NSString stringWithString:@"IntroViewChange"]; 

NSLog(@"%@", notificationName); 
[[NSNotificationCenter defaultCenter] postNotificationName:notificationName object:nil]; 

次のイベントを呼び出すクラスの後、私はセットアップリスナーを:

- (void)updateViewRotation 
{ 
    UIViewController *c = [[UIViewController alloc]init]; 
    [self presentModalViewController:c animated:NO]; 
    [self dismissModalViewControllerAnimated:NO]; 
    [c release]; 
} 

述べたと同じように、これは周りに巨大な仕事である前に、それは見にかなり重いと醜いですが、それはありません私は何が必要です。誰かがより効率的なコードを提供したいなら、私はそれを喜んで受け取ります。

+0

、 'updateViewRotation'は素晴らしいです。 – SwiftArchitect

+0

これは動作しますが、ビューコントローラCがすぐに表示されるため、奇妙な画面のフラッシュが作成されます。 –

2

@Elliott私が試した他のどのソリューションよりも優れているので、私はあなたに答えをアップアップしましたが、ここでは単純化しています。代わりに、通知を使用しての、ちょうどdidSelectViewControllerでこれを置く:のViewControllerは、この特別な注意を必要とすると、タブ上の最初の1である場合にのみ動作すること

if ([viewController respondsToSelector:@selector(updateViewRotation)]) { 
    [viewController performSelector:@selector(updateViewRotation)]; 
} 

はまた、iOSの6の非推奨のための更新:さらに通知を掲示することなく、これを達成するためのシンプルな方法がありますが

- (void)updateViewRotation 
{ 
    UIViewController *vc = [[UIViewController alloc] init]; 
    [self presentViewController:vc animated:NO completion:nil]; 
    [self dismissViewControllerAnimated:NO completion:nil]; 
} 
+0

更新をお寄せいただきありがとうございます。私が更新するのではなく、あなたのコードをここに残しておきます。それは誰かを助けてくれてうれしいですが、理想的な解決策ではありません! –

関連する問題