从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
对象的引用; CGColor
由UIColor
支持,但是在您有机会使用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]);