この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
こんにちは。モバイルアプリサービス部の平屋です。
本記事では iOS 10 で追加された UIGraphicsImageRenderer
クラスを使ってできることを紹介していきます。
UIGraphicsImageRenderer
クラスは、その名の通り画像を描画するためのクラスです。
実装
さっそく、UIGraphicsImageRenderer
クラスの使用例を見ていきます。
「色とサイズを指定して UIImage を生成するメソッド」を例に、UIGraphicsImageRenderer
クラスを使用する場合と使用しない場合の違いを比べてみます。
// 色とサイズを指定して UIImage を生成する
func image(color: UIColor, size: CGSize) -> UIImage {
// UIImage 生成処理
// ...
}
UIGraphicsImageRenderer を使用しない場合
「コンテキスト生成」「描画」「コンテキスト終了」などの各処理を、順番に 1 ステップずつ記述します。
func image(color: UIColor, size: CGSize) -> UIImage {
// ビットマッブコンテキストを生成
UIGraphicsBeginImageContext(size)
// コンテキスト取得
let context = UIGraphicsGetCurrentContext()
// 描画処理
context!.setFillColor(color.cgColor) // 色を指定
context!.fill(CGRect(origin: CGPoint.zero, size: size)) // 塗りつぶす
// 描画された画像を取得
let image = UIGraphicsGetImageFromCurrentImageContext()
// コンテキストを終了
UIGraphicsEndImageContext()
return image!
}
UIGraphicsImageRenderer を使用する場合
UIGraphicsImageRenderer
オブジェクトを作成し、image(actions:)
メソッドを使用して UIImage
を生成します。
描画処理のコードだけを actions
引数のブロックの中に記述します。開発者がコンテキストを管理する必要はありません。
func image(color: UIColor, size: CGSize) -> UIImage {
let renderer = UIGraphicsImageRenderer(size: size)
return renderer.image(actions: { rendererContext in
// 描画処理
rendererContext.cgContext.setFillColor(color.cgColor) // 色を指定
rendererContext.fill(CGRect(origin: CGPoint.zero, size: size)) // 塗りつぶす
})
}
余談
バイナリデータ作成
「UIGraphicsImageRenderer を使用する場合」では、UIGraphicsImageRenderer
の image(actions:)
メソッドを使用して UIImage
を生成するコードを紹介しました。
以下のメソッドを使用すれば、PNG または JPEG 形式のバイナリデータを作成できます。
pngData(actions:)
jpegData(withCompressionQuality:actions:)
関連クラス
以下の 2 つのクラスが UIGraphicsImageRenderer
に関連します。UIGraphicsRenderer
クラスは抽象基底クラスです。UIGraphicsPDFRenderer
は PDF の描画に特化したクラスです。
- UIGraphicsRenderer - UIKit | Apple Developer Documentation
- UIGraphicsPDFRenderer - UIKit | Apple Developer Documentation
さいごに
本記事では iOS 10 で追加された UIGraphicsImageRenderer
クラスを使ってできることを紹介しました。
UIGraphicsImageRenderer
クラスを使用すれば、画像を描画をするコードを書く時に、開発者は描画処理のコードだけに集中できるようになります。これは地味に嬉しいですね。