【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は、スタックと呼ばれる領域に保存され、
- 追加
- 取得
- 破棄
する際は、スタックから取り出すことになる。
結果
ソースコード
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 } }
参考