Crea UIImage con color sólido en Swift

Quiero crear programáticamente un UIImage lleno de un color sólido. Alguien tiene una idea de cómo hacer esto en Swift?

Otra buena solución, compatible con Swift 2.2 , es crear otro constructor en UIImage, de esta manera:

 public extension UIImage { public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) { let rect = CGRect(origin: .zero, size: size) UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0) color.setFill() UIRectFill(rect) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() guard let cgImage = image?.CGImage else { return nil } self.init(CGImage: cgImage) } } 

De esta manera, puede crear la imagen de color personalizada de esta manera:

 let redImage = UIImage(color: .redColor()) 

O, opcionalmente, cree la imagen con un tamaño personalizado:

 let redImage200x200 = UIImage(color: .redColor(), size: CGSize(width: 200, height: 200)) 

Swift 3.0

 public extension UIImage { public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) { let rect = CGRect(origin: .zero, size: size) UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0) color.setFill() UIRectFill(rect) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() guard let cgImage = image?.cgImage else { return nil } self.init(cgImage: cgImage) } } 

Aquí hay otra opción. Creo que querías un objeto UIImage exacto.

 func getImageWithColor(color: UIColor, size: CGSize) -> UIImage { let rect = CGRectMake(0, 0, size.width, size.height) UIGraphicsBeginImageContextWithOptions(size, false, 0) color.setFill() UIRectFill(rect) let image: UIImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } 

Pegue esto en su código Swift y llámelo

Swift 3.1:

 func getImageWithColor(color: UIColor, size: CGSize) -> UIImage { let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height) UIGraphicsBeginImageContextWithOptions(size, false, 0) color.setFill() UIRectFill(rect) let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() return image } 

Un enfoque más limpio sería encapsular la lógica dentro de una extensión de UIImage :

 import UIKit extension UIImage { class func imageWithColor(color: UIColor) -> UIImage { let rect: CGRect = CGRectMake(0, 0, 1, 1) UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, 1), false, 0) color.setFill() UIRectFill(rect) let image: UIImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } } 

Ahora el consumidor puede llamar, UIImage.imageWithColor(UIColor.blackColor()) para crear una imagen con fondo negro.

 class ViewController: UIViewController { @IBOutlet weak var imageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() imageView.backgroundColor = UIColor.redColor() } } 

Método similar si desea dibujar la imagen usted mismo o conectar uno a través de IBOutlet.

 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() var frame = CGRectMake(100,100,100,100) var imageView2 = UIImageView(frame: frame) imageView2.backgroundColor = UIColor.redColor() self.view.addSubview(imageView2) } } 

Tercer método tomado de anthonyliao. Un poco más complicado:

 class ViewController: UIViewController { func getImageWithColor(color: UIColor, size: CGSize) -> UIImage { UIGraphicsBeginImageContextWithOptions(size, false, 0) color.setFill() UIRectFill(CGRectMake(0, 0, 100, 100)) var image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } override func viewDidLoad() { super.viewDidLoad() var imageView = UIImageView(frame: CGRectMake(100,100,100,100)) let screenImage = getImageWithColor(UIColor.redColor(), size: CGSize(width: 100, height: 100)) imageView.image = screenImage self.view.addSubview(imageView) } } 

Puede usar la nueva API iOS 10 UIGraphicsImageRenderer .

Aquí hay una extensión de UIColor en Swift 3.1

 extension UIColor { func getImage(size: CGSize) -> UIImage { let renderer = UIGraphicsImageRenderer(size: size) return renderer.image(actions: { rendererContext in self.setFill() rendererContext.fill(CGRect(x: 0, y: 0, width: size.width, height: size.height)) }) }} 

Swift 4 versión:

 extension UIColor { func image(_ size: CGSize = CGSize(width: 1, height: 1)) -> UIImage { return UIGraphicsImageRenderer(size: size).image { rendererContext in self.setFill() rendererContext.fill(CGRect(x: 0, y: 0, width: size.width, height: size.height)) } } } 

Uso:

 let image0 = UIColor.orange.image(CGSize(width: 128, height: 128)) let image1 = UIColor.yellow.image() 

Swift 3 versión de @anthonyliao Respuesta aceptada:

 class func getImageWithColor(color: UIColor, size: CGSize) -> UIImage { let rect = CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: size.width, height: size.height)) UIGraphicsBeginImageContextWithOptions(size, false, 0) color.setFill() UIRectFill(rect) let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() return image } 

Una buena manera es tener una propiedad calculada como esta:

 extension UIColor { var imageRepresentation : UIImage { let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0) UIGraphicsBeginImageContext(rect.size) let context = UIGraphicsGetCurrentContext() context?.setFillColor(self.cgColor) context?.fill(rect) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image! } } 

Uso:

 let redImage = UIColor.red.imageRepresentation