2011-12-22 5 views
15

Xcode 4.2.1を使用するiPad iOS 5.0.1では、新しい「シングルビュー」iPadプロジェクトを作成します。コントローラでは、追加:回転後、UIView座標はスワップされますが、UIWindowはスワップされません。

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

- (void) dumpView: (UIView *) view { 
    CGRect frame = view.frame ; 
    CGRect bounds = view.bounds ; 
    CGPoint center = view.center ; 

    NSLog(@"view [%@]:%d frame=%@ bounds=%@ center=%@" 
      , NSStringFromClass(view.class) 
      , [view hash] 
      , NSStringFromCGRect(frame) 
      , NSStringFromCGRect(bounds) 
      , NSStringFromCGPoint(center)) ; 
} 

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation) fromInterfaceOrientation { 

    NSLog(@"INViewController.didRotateFromInterfaceOrientation: %d to %d", fromInterfaceOrientation, self.interfaceOrientation) ; 
    [self dumpView: self.view] ; 
    [self dumpView: self.view.superview] ; 
} 

実行]を、それは、デバイスを回転させ、あなたが取得します:つまり

INViewController.didRotateFromInterfaceOrientation: 2 to 4 
view [UIView] bounds={{0, 0}, {1024, 748}} center={394, 512} 
view [UIWindow] bounds={{0, 0}, {768, 1024}} center={384, 512} 

を、UIViewのは予想通り「風景にスワップ」その座標を有するが、その親UIWindowはまだまた

は、UIViewのサイズが少し間違っているようだ...ポートレートモードであることを主張する:yは20が0であるであるべきである座標...

誰でもWH知っていますこの手段で?

答えて

37

UIWindowの座標系は、常に縦向きです。これは、そのrootViewControllerのビューの変換を設定することによって回転を適用します。たとえば、シングルビューテンプレートを使用してテストアプリケーションを作成し、それを実行しました。縦向きで右回転させた後

(gdb) po [[(id)UIApp keyWindow] recursiveDescription] 
<UIWindow: 0x9626a90; frame = (0 0; 768 1024); layer = <UIWindowLayer: 0x9626b80>> 
    | <UIView: 0x96290e0; frame = (0 0; 748 1024); transform = [0, 1, -1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x96286a0>> 

(gdb) po [[(id)UIApp keyWindow] recursiveDescription] 
<UIWindow: 0x9626a90; frame = (0 0; 768 1024); layer = <UIWindowLayer: 0x9626b80>> 
    | <UIView: 0x96290e0; frame = (0 20; 768 1004); autoresize = W+H; layer = <CALayer: 0x96286a0>> 

左回転させた後(90度回転行列に)設定されている変換方法

(gdb) po [[(id)UIApp keyWindow] recursiveDescription] 
<UIWindow: 0x9626a90; frame = (0 0; 768 1024); layer = <UIWindowLayer: 0x9626b80>> 
    | <UIView: 0x96290e0; frame = (20 0; 748 1024); transform = [0, -1, 1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x96286a0>> 

お知らせ場合デバイスが回転します。

UIViewのサイズについての質問:ビューの境界はそれ自身の座標空間にあり、デフォルトではビューの境界の原点は座標空間の原点(0,0)にあります。ビューのフレームは、親の座標空間にあります。上記の再帰的な記述で期待していた20個を見ることができます。または、フレームを直接印刷することで、フレームを直接印刷することができます。

(gdb) p (CGRect)[[[[(id)UIApp keyWindow] subviews] lastObject] frame] 
$2 = { 
    origin = { 
    x = 0, 
    y = 20 
    }, 
    size = { 
    width = 768, 
    height = 1004 
    } 
} 
+1

意味があります。ありがとうございました。ちなみに、gdbを実際にインタラクティブに使うことができることを私に見せてくれてありがとう: – verec

+0

@rob UIView.frameのrefドキュメントは言う:例外:transformプロパティがIDTでない場合したがって無視する必要があります。あなたはそれについて詳述できますか?回転したビューのフレームをアニメーション化して、オーバーレイとしてスライドさせたいとします。 – tribalvibes

+1

'transform'がアイデンティティでないとき、私は自分のコードで' frame'に依存しません。しかし、 'frame'メソッドは常に' [self convertRect:self.bounds toView:self.superview] 'を返すように見えるので、デバッグするときに便利です。 –

関連する問題