はじめに
UIViewをUIImageに変換するというよくあるやつです。 今だとこのやり方が良いのではないかというのが見つかったのでメモがてら記載します。
環境設定
以下の環境を使用しています。
- Xcode 11.4.1
- Swift 5.2
内容
いかに作成したextensionメソッドを記載します。
UIGraphicsImageRenderer
を使用することでシンプルに書くことができます。
public extension UIView { func convertToImage() -> UIImage { let imageRenderer = UIGraphicsImageRenderer.init(size: bounds.size) return imageRenderer.image { context in layer.render(in: context.cgContext) } } }
従来通りのよくあるやり方は下記です。
UIGraphicsBeginImageContextWithOptions
を使用することでUIImage
を作成しています。
UIGraphicsBeginImageContextWithOptions
のscale
に0.0以外を入力したり、 UIGraphicsBeginImageContext
を使用したりすると画像がぼやけたりするので注意が必要です。
また、 UIGraphicsGetImageFromCurrentImageContext()
の返却値がOptionalのため安全に書こうとするとメソッドの返却値が UIImage?
となります。
public extension UIView { func convertToImage() -> UIImage? { UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0.0) guard let context = UIGraphicsGetCurrentContext() { return nil } layer.render(in: context) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image }
まとめ
UIGraphicsImageRenderer
はiOS10で導入されたclassです。contextの制御やscaleの管理などをせずに描画を行うことができます。
OSのサポートバージョンが10.0以上でしたら是非使用してみてください。