Takahiro Octopress Blog

-1から始める情弱プログラミング

Swift3でUIImageを任意の角度で回転させる方法について

はじめに

以前、UIImageを任意の角度で回転させる方法についてを書きましたが、今回はそのSwift3版です。
Objective-Cで書いた方法と基本的には同じではあるのですが、そのままの書き方が使えるわけではないため覚えておいて損はないはず!

では早速見ていきましょう。

UIImageの回転方法

Objective-Cでは下記のように回転させていました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 元の画像。ここではtest.pngという画像があるとします。
UIImage *image = [UIImage imageNamed:@"test.png"];

CGSize imgSize = {image.size.width, image.size.height};
// Contextを開く
UIGraphicsBeginImageContext(imgSize);
CGContextRef context = UIGraphicsGetCurrentContext();
// 回転の中心点を移動
CGContextTranslateCTM(context, image.size.width/2, image.size.height/2);
// Y軸方向を補正
CGContextScaleCTM(context, 1.0, -1.0);

// ラジアンに変換(45°回転させたい場合)
float radian = 45 * M_PI / 180;
CGContextRotateCTM(context, radian);
// 回転画像の描画
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(-image.size.width/2, -image.size.height/2, image.size.width, image.size.height), image.CGImage);

// Contextを閉じる
UIImage *rotatedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

// UIImageViewに回転後の画像を設定
UIImageView *imageView = [[UIImageView alloc] init];
imageView.image = rotatedImage;

これをSwift3で書き直すと以下のようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 元の画像。ここではtest.pngという画像があるとします。
let image = UIImage.init(named: "test")

let imgSize = CGSize.init(width: image.size.width, height: image.size.height)
// Contextを開く
UIGraphicsBeginImageContextWithOptions(imgSize, false, 0.0)
let context: CGContext = UIGraphicsGetCurrentContext()!
// 回転の中心点を移動
context.translateBy(x: image.size.width/2, y: image.size.height/2)
// Y軸方向を補正
context.scaleBy(x: 1.0, y: -1.0)

// ラジアンに変換(45°回転させたい場合)
let radian: CGFloat = 45 * CGFloat(Double.pi) / 180.0
context.rotate(by: radian)
// 回転画像の描画
context.draw(image.cgImage!, in: CGRect.init(x: -image.size.width/2, y: -image.size.height/2, width: image.size.width, height: image.size.height))

// Contextを閉じる
let rotatedImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()

// UIImageViewに回転後の画像を設定
let imageView = UIImageView.init()
imageView.image = rotatedImage

まとめ

さていかがでしたでしょうか?
基本的な回転の流れは変わりませんね。
ただ、Swift3で書いた方が心なしか自然なメソッドで書けている気がするのは筆者だけですかね…
ということで本日はここまで。

Comments