2012年12月18日火曜日

UIViewをtransformで回転させるときに気をつけること

例として、こんなラベルが定義されてるとして話を進めます。

UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(006030)];
label.text = @"ABCDE";
label.textColor = [UIColor whiteColor];
label.backgroundColor = [UIColor blueColor];


1.回転を行うとframeが変更される
次のようなコードで90度回転させるとします。
 
label.transform = CGAffineTransformMakeRotation(M_PI_2);

そうするとframeのCGRectは、

origine: x=15, y=-15
size: width=30, height=60

と変更されてしまいます。
また、対象が斜め向きになる角度(45度とか)で回転させると、回転後の対象がちょうど収まるCGRectに変更されます。

当然ですが、この時点で次のように元々と同じframeをセットしても回転状態はキープされているのでおかしな表示になっってしまいます。

label.frame = CGRectMake(00, 6030);


2.回転後にビューのサイズを変更する場合は、boundsを再設定するか一度回転をリセットしてframeを再設定する
これは必ずしもと言うわけではないのですが、そうしておくと分かりやすくなることが多いと思います。
というのも、1の通り回転後はframeが変更されているので、frameを再設定して正確にサイズを変えようと思うと、に再設定するCGRectのサイズを計算する必要が出てきます。
(多分三角関数的なアレになると思うのですがそこまで調べてはいません。)

label.transform = CGAffineTransformMakeRotation(M_PI_2/2);
label.bounds = CGRectMake(009030);

あるいは

label.transform = CGAffineTransformMakeRotation(M_PI_2/2);
label.transform = CGAffineTransformMakeRotation(0);
label.frame = CGRectMake(009030);
label.transform = CGAffineTransformMakeRotation(M_PI_2/2);

boundsの場合は中心位置がリサイズ前のままになり、リセット+frameの場合はリサイズ後の中心位置を基準に回転することになるので、その点は注意が必要です。


3.基準となるCGAffineTransformを指定しないと無回転状態を基準に回転する
連続して回転させる場合、以下のように現在のCGAffineTransformを基準として指定してやる必要があります。

label.transform = CGAffineTransformRotate(label.transform, M_PI_2)
label.transform = CGAffineTransformRotate(label.transform, M_PI_2)

以下のようにしてもずっと90度のままです。

label.transform = CGAffineTransformMakeRotation(M_PI_2);
label.transform = CGAffineTransformMakeRotation(M_PI_2);

transformに保持しているCGAffineTransformを設定し直すので当然と言えば当然ですね。


0 件のコメント:

コメントを投稿