2012-01-05 6 views
7

UIViewUIWindowに追加していますが、それはkeyWindowではありません。デバイスの回転時にUIViewを回転させたいです。 私が設定する必要のあるウィンドウまたはビューの特別なプロパティは?現在、ビューは回転していません。UIWindowのUIViewサブビューが回転しません

私は、アプリケーションのkeyWindowの最初のサブビューだけがデバイスのローテーションについて語っていることに気付いています。テストとして私はkeyWindowの最初のサブビューに私の見解を加えました。これにより、ビューが回転します。しかし、keyWindowの最初のサブビューのサブビューであるビューは、さまざまな審美的理由で機能しません。

別のアプローチでは、ビュー内のデバイスの向きの変更を観察し、回転コードを自分で書き込むことができます。しかし、可能であれば、このコードを書かないようにしたいと思います。

答えて

7

UIViewは回転を処理しません。UIViewControllerは回転を処理しません。 だから、あなたが必要とするすべてはshouldAutorotateToInterfaceOrientationを実装し、あなたのUIWindowにそのような

何かrootViewControllerとして、このコントローラを設定のUIViewController、作成することです:

UIViewController * vc = [[[MyViewController alloc] init] autorelease]; 

    vc.view.frame = [[UIScreen mainScreen] bounds]; 
    vc.view.backgroundColor = [UIColor colorWithWhite:0 alpha:0.4]; 

    //you vc.view initialization here 

    UIWindow * window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    window.windowLevel = UIWindowLevelStatusBar; 
    window.backgroundColor = [UIColor clearColor]; 
    [window setRootViewController:vc]; 
    [window makeKeyAndVisible]; 

を、私はそれをしたい原因私は、このMyViewControllerを使用しましたメインアプリケーションの変更

@interface MyViewController : UIViewController 

    @end 

    @implementation MyViewController 

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
    { 
     UIWindow *window = ((UIWindow *)[[UIApplication sharedApplication].windows objectAtIndex:0]); 
     UIViewController *controller = window.rootViewController; 

     if (!controller) { 
      NSLog(@"%@", @"I would like to get rootViewController of main window"); 
      return YES; 
     } 
     return [controller shouldAutorotateToInterfaceOrientation:toInterfaceOrientation]; 
    } 
    @end 

を反映していますが、常にちょうどあなたが希望する場合は、任意の方向にYESを返すか、あなたのロジックを記述することができます。

+0

私は同様の問題があります - UIWindowとそのビューは回転していないようです - この解決法はうまくいかないようです私のために。私は、ウィンドウのrootViewControllerを正常にそのサブビューを回転させるコントローラーにしますが、ウィンドウのサブビューはまったく回転しません。 –

+0

そして、それらはUIViewControllerには添付されておらず、UIViewControllerだけが回転を管理するべきではありません。 –

+0

これは素晴らしい答えです。ありがとうございます。これは、二次ウィンドウ "Just Work"でローテーションを行います。ウィンドウを後で画面から削除するには、そのrootViewControllerをnilに設定し、その参照も自身に設定してください。そうすれば、ARCはそれを割り当て解除できます。 – nobre

2

あなたは[[NSNotificationCenter defaultCenter] addObserver:自己セレクタ:@selector(didRotate :) 名:UIDeviceOrientationDidChangeNotificationオブジェクト:nilを]プロジェクトにコードの下に

を追加することができます。

これを処理する関数を作成しました。

+0

私は 'didRotate'を書くのではなく、"フリー "のローテーションを好むでしょう。 – SundayMonday

関連する問題