从UIColor创buildUIImage作为UIButton的背景图像

我正在创build一个像这样的彩色图像:

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(); 

然后将其用作button的背景图像:

 [resultButton setBackgroundImage:img forState:UIControlStateNormal]; 

这很好的使用redColor,但是我想使用RGB颜色(如注释行中所示)。 当我使用RGB颜色时,button背景不会改变。

我错过了什么?

我创build了一个围绕UIButton的类别,可以设置button的背景颜色并设置状态。 你可能会觉得这很有用。

 @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; } 

这将是本月开放采购的帮助类别的一部分。

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! } } 

用于

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

你使用ARC吗? 这里的问题是你没有一个你正在尝试应用的UIColor对象的引用; CGColorUIColor支持,但是在您有机会使用CGColor之前,ARC将取消分配UIColor

objc_precise_lifetime解决scheme是使用objc_precise_lifetime属性指向您的UIColor的本地variables。

你可以在这篇关于UIColor和短的ARC生命周期的文章中阅读更多关于这个确切的例子,或者获得关于objc_precise_lifetime属性的更多细节。

Xamarin.iOS解决scheme

  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; } 

为所有值添加点:

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

否则,你用int分隔float。

我认为227./255中的255被认为是一个整数,除法总是返回0

你的代码工作正常。 您可以使用Iconfactory的xScope来validationRGB颜色。 只需比较它[UIColor whiteColor]

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