it-swarm.com.ru

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

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

149
Thorsten

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

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

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

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

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

5
Jesse Rusak

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

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

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

4
iGerm

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

3
aknew

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

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