【Swift】UIGraphicsContextで空のUIImageを作る

どうも、ねこきち(@nekokichi1_yos2)です。

 

今回は、画像が入ってないUIImageを作る方法、を備忘録として書きます。

 

解説

 

UIImageは画像を格納するクラスなので、画像がなければクラスとして機能しません。

 

しかし、

「画像はないけど、指定したサイズのUIImageを用意したい」

場合がありませんか?

 

例えば、何らかの条件分岐でUIImageViewに画像を格納するかの有無を確認して、もし格納しない場合、透明の画像を入れたいなど。

 

UIImageView.image = nil、UIImageView.backgroundColor = .red、などで画像がないことを示すこともできます。

 

ですが、指定したサイズの画像をUIImageViewに入れなければ、レイアウトが崩れてしまうことがあるかもしれません。

 

そこで、画像を持たないUIImage、を作る方法を紹介します。

(変数でUIImageを生成して、frameとかbackgroundColorを設定すれば簡単なのですが、敢えて違う方法で生成する方法なので書いていきます。)

 

UIGraphicsContextを使う

 

参考記事を読んで、ざっくりまとめると

UIGraphicsContext:描画情報を管理してるオブジェクト

 

 

言わば、指定した情報(背景色、描画領域)を元に、0から画像を描画(生成)するためのもの。

 

使い方は、

  • UIGraphicsContextを生成
  • UIGraphicsContextに情報を設定
  • UIGraphicsContextで画像を生成
  • UIGraphicsContextを破棄する

 

UIGraphicsContextは、スタックと呼ばれる領域に保存され、

  • 追加
  • 取得
  • 破棄

 する際は、スタックから取り出すことになる。

 

結果

 

f:id:nekokichi_yos2:20200903081529g:plain

 

ソースコード

 

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var imageView: UIImageView!

    @IBAction func button(_ sender: Any) {
        let width  = imageView.frame.width
        let height = imageView.frame.height
        // 空の画像に必要nサイズ情報
        let imageCGSize = CGSize(width: width, height: height)
        // imageViewに空の画像をセット
        imageView.image = UIImage.getEmptyImage(imageColor: .red, imageSize: imageCGSize, imageView: imageView)
    }
    
}

extension UIImage {
class func getEmptyImage(color: UIColor, size: CGSize, imageView:UIImageView) -> UIImage { // グラフィックスコンテキストを作成 UIGraphicsBeginImageContext(size)
// グラフィックスコンテキスト用の位置情報 let rect = imageView.frame // グラフィックスコンテキストを取得 let context = UIGraphicsGetCurrentContext()
// グラフィックスコンテキストの設定 context!.setFillColor(color.cgColor) context!.fill(rect) // グラフィックスコンテキストの画像を取得 let image = UIGraphicsGetImageFromCurrentImageContext()! // グラフィックスコンテキストの編集を終了 UIGraphicsEndImageContext() return image } } 

 

参考

 

qiita.com

dev.classmethod.jp

ios.ch3cooh.jp