13 | 9月 | 2011 | HMDT Blog

カテゴリー : 2011年 9月13日

UIViewControllerによるUIViewの回転 その2


前回に続き、UIViewControllerの話。今回は、親ビューとの関係を。

UIViewControllerを使って回転させると、管理しているビューのboundsとtransformが変化する。となると次は、親ビューでの位置を表すframeが気になってくる。だけど、UIViewのドキュメントによると、transformが単位行列以外の場合、frameの値は不定(undefined)ということになっている。だから、centerの値から考察するのが正しい。

ということで、ビューの回転とboundsおよびcenterの値を調べてみた。ウインドウの上に直接UIViewControllerを貼付けて、4方向に回転させる。結果はこんな感じ。

うーん?分かったような分からんような。

ポイントその1。向きによってboundsの値は同じであっても、centerの値は異なる。縦の正位置と逆さま位置、および横の右向き左向きは、それぞれboundsの値は同じだけどcenterの値が異なる。

ポイントその2。縦と横でcenterのずれる値の座標が違う。縦だとy座標がずれて、横だとx座標がずれる。

なんでこんなことが起きているかというと、boundsは子ビューの座標系で測るのに対して、centerは親ビューの座標系での値になるからだ。つまり、boundsはtransformの影響を受けるが、centerは受けない。親ビューの座標系では、デバイスがどんだけ回転しようと、デバイス左上が原点だ。

さらに話をややこしくしているのが、ステータスバーの存在。デバイスを回転すると、ビューが回転するけど、ステータスバーも回転する。ということは、その分centerは移動しなくてはいけない。

ということで、それぞれの向きの位置情報について、もう少し突っ込んで記述すると、こんな感じになる。

これで、boundsとcenterの関係が分かったでしょ。デバイスの回転とともにステータスバーも回転するんで、ステータスバーの高さである20ピクセルのずれが発生している。左上原点のところにステータスバーが存在するかどうかがポイントだね。あと、この図で見るとまるでcenterが回転しているみたいだけど、こっちじゃないからな。回転しているのはあくまでboundsの方だぞ。