[iOS 10] UIGraphicsImageRenderer について

2016.10.11

この記事は公開されてから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 を使用する場合」では、UIGraphicsImageRendererimage(actions:) メソッドを使用して UIImage を生成するコードを紹介しました。

以下のメソッドを使用すれば、PNG または JPEG 形式のバイナリデータを作成できます。

  • pngData(actions:)
  • jpegData(withCompressionQuality:actions:)

関連クラス

以下の 2 つのクラスが UIGraphicsImageRenderer に関連します。UIGraphicsRenderer クラスは抽象基底クラスです。UIGraphicsPDFRenderer は PDF の描画に特化したクラスです。

さいごに

本記事では iOS 10 で追加された UIGraphicsImageRenderer クラスを使ってできることを紹介しました。

UIGraphicsImageRenderer クラスを使用すれば、画像を描画をするコードを書く時に、開発者は描画処理のコードだけに集中できるようになります。これは地味に嬉しいですね。

参考資料