Создание UIImage из UIColor для использования в качестве фонового изображения для UIButton

Я создаю цветное изображение следующим образом:

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, фон кнопок не изменяется.

Что мне не хватает?

Ответ 1

Я создал категорию вокруг 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)

Ответ 2

Решение 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;
 }

Ответ 3

Используете ли вы ARC? Проблема здесь в том, что у вас нет ссылки на объект UIColor, который вы пытаетесь применить; CGColor поддерживается этим UIColor, но ARC освободит UIColor, прежде чем вы сможете использовать CGColor.

Самое ясное решение - иметь локальную переменную, указывающую на ваш UIColor атрибут objc_precise_lifetime.

Подробнее об этом конкретном случае можно узнать в в этой статье о жизни UIColor и коротких ARC или получить более подробную информацию о objc_precise_lifetime.

Ответ 4

Добавьте точки ко всем значениям:

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

В противном случае вы разделите float на int.

Ответ 5

Я предполагаю, что 255 в 227./255 воспринимается как целое число и деление всегда возвращается 0

Ответ 6

Ваш код работает нормально. Вы можете проверить цвета RGB с помощью Iconfactory xScope. Просто сравните его с [UIColor whiteColor].

Ответ 7

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