By Hoshino

0

UIViewの回転、拡大、縮小

Categories : Objective-C

iPhoneアプリといえばアニメーションが綺麗です。

どこぞのアンドロイドと違って変にカクカクしないですし、滑らかです。

そしてアニメーションといえば移動、回転、拡大、縮小の組み合わせが多いでしょう。

そんなわけで今回は
UIViewをCGAffineTransformとか言うよく分からない奴で移動、回転、拡大、縮小をする方法の基本を学びましょう。

とりあえず対象のViewを用意します。

ほおおおおお…
そいやっ

– (void)viewDidLoad {
        [super viewDidLoad];

        UIView *view = [UIView new];
        view.frame = CGRectMake(0, 0, 200, 200);
        view.backgroundColor = [UIColor blueColor];
        view.center = CGPoinMake(self.view.frame.size.width/2, self.view.frame.size.height/2);
        [self.view addSubview:view];

        UIImageView *imageView = [UIImageView new];
        imageView.image = [UIImage imageNamed:@”apple”];
        [view addSubview:imageView];
        …
}

いい感じですね。

そして相変わらずこのブログのコードのカラーリングはとっても見やすいです。

1.移動

右に40px、上に50px移動させます。

view.transform = CGAffineTransformMakeTranslation(40, -50);

2.回転

30°右に回転させます。

view.transform = CGAffineTransformMakeRotation(M_PI * 30.0 / 180.0);

こんなDefineを用意すればスッキリします。

#define RADIAN(x) (M_PI * (x) / 180.0)

view.transform = CGAffineTransformMakeRotation(RADIAN(30));

3.拡大と縮小

拡大と縮小です。比率を大きくすれば拡大、小さくすれば縮小出来ます。

view.transform = CGAffineTransformMakeScale(1.5, 1.5);

第1引数がx方向の拡大率、
第2引数がy方向の拡大率なので、別の値を入れれば歪ませることも出来ます。

view.transform = CGAffineTransformMakeScale(0.5, 1.2);

4.初期化

真っさらな状態に戻します。つまりデフォルト値です。

view.transform = CGAffineTransformIdentity;

5.組み合わせる

「拡大して回転」みたいにアフィン変換を組み合わせます。

5.1.対象となるCGAffineTransformを指定するパターン

アフィン変換をかける対象となるCGAffineTransformを指定するパターンです。

こんな感じ。

view.transform = CGAffineTransformMakeScale(1.2, 1.2);
view.transform = CGAffineTransformRotate(view.transform, RADIAN(50));
view.transform = CGAffineTransformTranslate(view.transform, -30, 30);

注意する点として、こちらは一見
「1.2倍に拡大」⇒「右に50°傾ける」⇒「左に30px、下に30px移動」ってな変換をしてるイメージですが、Makeが付かないCGAffineTransformXXXの関数は第2引数の処理の後、第1引数のCGAffineTransformを掛けるので、

①「1.2倍に拡大」
②「右に50°傾ける」⇒①
③「左に30px、下に30px移動」⇒②

となり、
実際は「左に30px、下に30px移動」⇒「右に50°傾ける」⇒「1.2倍に拡大」という処理になります。

5.2.CGAffineTransformを合成するパターン

複数のCGAffineTransformを合成したものを最後に適用させるパターンです。

CGAffineTransform t1 = CGAffineTransformMakeTranslation(-30, 30);
CGAffineTransform t2 = CGAffineTransformMakeRotation(RADIAN(50));
CGAffineTransform t3 = CGAffineTransformMakeScale(1.2, 1.2);
CGAffineTransform t = CGAffineTransformConcat(t1, t2);
t = CGAffineTransformConcat(t, t3);
view.transform = t;

CGAffineTransformConcatは第1引数×第2引数で計算するので、見た通り
「左に30px、下に30px移動」⇒「右に50°傾ける」⇒「1.2倍に拡大」という処理になります。

こっちの方がパッと想像がつきますね。

これで基本は完璧だっ

(あっきぃは基本しか知らない。)