Crear un UIImage desde un UIColor para usar como imagen de fondo para UIButton

Estoy creando una imagen coloreada como esta:

CGRect rect = CGRectMake(0, 0, 1, 1); UIGraphicsBeginImageContext(rect.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, [[UIColor redColor] CGColor]); // [[UIColor colorWithRed:222./255 green:227./255 blue: 229./255 alpha:1] CGColor]) ; CGContextFillRect(context, rect); UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 

y luego usarlo como imagen de fondo de un botón:

 [resultButton setBackgroundImage:img forState:UIControlStateNormal]; 

Esto funciona muy bien con el color rojo, sin embargo, quiero usar un color RGB (como se muestra en la línea comentada). Cuando uso el color RGB, el fondo de los botones no cambia.

¿Qué me estoy perdiendo?

Creé una categoría alrededor de UIButton para poder establecer el color de fondo del botón y establecer el estado. Puede encontrar esto útil.

 @implementation UIButton (ButtonMagic) - (void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state { [self setBackgroundImage:[UIButton imageFromColor:backgroundColor] forState:state]; } + (UIImage *)imageFromColor:(UIColor *)color { CGRect rect = CGRectMake(0, 0, 1, 1); UIGraphicsBeginImageContext(rect.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, [color CGColor]); CGContextFillRect(context, rect); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } 

Esto será parte de un conjunto de categorías de ayuda que estoy abriendo este mes.

Swift 2.2

 extension UIImage { static func fromColor(color: UIColor) -> UIImage { let rect = CGRect(x: 0, y: 0, width: 1, height: 1) UIGraphicsBeginImageContext(rect.size) let context = UIGraphicsGetCurrentContext() CGContextSetFillColorWithColor(context, color.CGColor) CGContextFillRect(context, rect) let img = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return img } } 

Swift 3.0

 extension UIImage { static func from(color: UIColor) -> UIImage { let rect = CGRect(x: 0, y: 0, width: 1, height: 1) UIGraphicsBeginImageContext(rect.size) let context = UIGraphicsGetCurrentContext() context!.setFillColor(color.cgColor) context!.fill(rect) let img = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return img! } } 

Usar como

 let img = UIImage.from(color: .black) 

Solución Xamarin.iOS

  public UIImage CreateImageFromColor() { var imageSize = new CGSize(30, 30); var imageSizeRectF = new CGRect(0, 0, 30, 30); UIGraphics.BeginImageContextWithOptions(imageSize, false, 0); var context = UIGraphics.GetCurrentContext(); var red = new CGColor(255, 0, 0); context.SetFillColor(red); context.FillRect(imageSizeRectF); var image = UIGraphics.GetImageFromCurrentImageContext(); UIGraphics.EndImageContext(); return image; } 

¿Estás usando ARC? El problema aquí es que no tiene una referencia al objeto UIColor que está intentando aplicar; el CGColor está respaldado por ese UIColor , pero ARC desasignará el UIColor antes de que tenga la oportunidad de usar el CGColor .

La solución más clara es tener una variable local que apunte a su UIColor con el atributo objc_precise_lifetime .

Puede leer más sobre este caso exacto en este artículo sobre UIColor y vidas útiles cortas de ARC u obtener más detalles sobre el atributo objc_precise_lifetime .

Agrega los puntos a todos los valores:

 [[UIColor colorWithRed:222./255. green:227./255. blue: 229./255. alpha:1] CGColor]) ; 

De lo contrario, está dividiendo float por int.

Supongo que 255 en 227./255 se percibe como un número entero y la división siempre es return 0

Tu código funciona bien Puede verificar los colores RGB con el xScope de Iconfactory . Simplemente compárelo con [UIColor whiteColor] .

 CGContextSetFillColorWithColor(context,[[UIColor colorWithRed:(255/255.f) green:(0/255.f) blue: (0/255.f) alpha:1] CGColor]);