Создание 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]);