从 UIColor 创建用作 UIButton 背景图像的 UIImage

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

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

然后用它作为一个按钮的背景图像:

[resultButton setBackgroundImage:img forState:UIControlStateNormal];

使用 redColor 效果很好,但是我想使用 RGB 颜色(如注释行所示)。当我使用 RGB 颜色时,按钮背景不会改变。

我错过了什么?

102873 次浏览

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

您的代码工作正常。您可以验证的 RGB 颜色与 象工厂的 xScope。只是比较它的 [UIColor whiteColor]

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

你在用 ARC 吗?这里的问题是,您没有对您试图应用的 UIColor对象的引用; CGColor由该 UIColor支持,但是 ARC 将在您有机会使用 CGColor之前释放 UIColor

最明显的解决方案是让一个局部变量指向具有 objc_precise_lifetime属性的 UIColor

你可以在 这篇文章关于 UIColor 和较短的 ARC 生命周期上读到更多关于这个确切的案例或者得到更多关于 objc_precise_lifetime属性的细节。

将点添加到所有值中:

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

否则,就是将 float 除以 int。

我围绕 UIButton 创建了一个类别,以便能够设置按钮的背景颜色并设置状态。你会发现这个很有用。

@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)

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