単色で塗りつぶした UIImage を生成する
指定した UIColor の単色で塗りつぶした UIImage を生成したい。
※ 追記済み
Swift5
iOS10.0 から追加された UIGraphicsImageRenderer
を使用する。
A. UIColor の Extension に追加
extension UIColor { func image(size: CGSize) -> UIImage { return UIGraphicsImageRenderer(size: size).image { rendererContext in self.setFill() // 色を指定 rendererContext.fill(.init(origin: .zero, size: size)) // 塗りつぶす } } }
使用時
let redImage = UIColor.red.image(size: .init(width: 50, height: 50))
B. UIImage の Extension に追加
extension UIImage { convenience init?(color: UIColor, size: CGSize) { guard let cgImage = UIGraphicsImageRenderer(size: size).image(actions: { rendererContext in rendererContext.cgContext.setFillColor(color.cgColor) // 色を指定 rendererContext.fill(.init(origin: .zero, size: size)) // 塗りつぶす }).cgImage else { return nil } self.init(cgImage: cgImage) } }
使用時
// Optional let blueImage = UIImage(color: .blue, size: .init(width: 50, height: 50))
Swift3
UIImage の Extension に追加。
extension UIImage { static func image(color: UIColor, size: CGSize) -> UIImage { UIGraphicsBeginImageContextWithOptions(size, false, 0.0) let context = UIGraphicsGetCurrentContext()! context.setFillColor(color.cgColor) context.fill(CGRect(origin: .zero, size: size)) let image = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() return image } }
使用時
let greenImage = UIImage.image(color: .green, size: CGSize(width: 50, height: 50))
Swift2
UIImage の Extension に追加。
import UIKit extension UIImage { static func image(color color: UIColor, size: CGSize) -> UIImage { UIGraphicsBeginImageContext(size) let context = UIGraphicsGetCurrentContext() CGContextSetFillColorWithColor(context, color.CGColor) CGContextFillRect(context, CGRect(origin: CGPointZero, size: size)) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } }
使用時
let greenImage = UIImage.image(color: UIColor.greenColor(), size: CGSize(width: 50, height: 50))