Изменить цвет UIButton BG на выделенном, но сохранить радиус угла слоя?

Я изменяю цвет фона UIButton с помощью этого метода категории, используя изображение размером 1 на 1 пиксель:

- (void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state
{
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, 1), NO, 0);
    [backgroundColor setFill];
    CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, 1, 1));
    UIImage *backgroundImage = UIGraphicsGetImageFromCurrentImageContext();
    [self setBackgroundImage:backgroundImage forState:state];
    UIGraphicsEndImageContext();
}

Однако это переопределяет мою настройку .layer.cornerRadius. Мне нужна кнопка с закругленными углами, а также кнопка, цвет фона которой я могу изменить при выделении.

Как-нибудь обойти это? Радиус угла должен быть динамическим.


person Luke    schedule 10.09.2014    source источник
comment
Почему вы устанавливаете цвет фона с изображением, а не с UIColor? Если ваше изображение 1px x 1px, это уже сплошной цвет. В качестве альтернативы вы можете использовать метод UIColor colorWithPatternImage:   -  person Sean Kladek    schedule 10.09.2014
comment
Мне нужно установить цвет фона выделенного состояния, UIKit не предоставляет средств для этого, отсюда и категория. Однако такой способ убивает закругленные углы, это то, что мне нужно исправить.   -  person Luke    schedule 10.09.2014


Ответы (2)


Итак, все, что мне нужно было сделать, это убедиться, что button.layer.masksToBounds включен. Проблема решена, подклассы не требуются.

person Luke    schedule 12.09.2014

Подкласс UIButton. В вашем подклассе установите радиус угла в методе инициализации. Если вы используете xib, это будет initWithDecoder:

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        self.layer.cornerRadius = 5.f;
    }

    return self;
}

Также подкласс setHighlighted: метод. Здесь вы установите цвет фона. Проверьте значение «выделено» и соответствующим образом назначьте цвет фона. В этом примере кнопка представляет собой синюю кнопку, которая выделяется красным цветом и имеет закругленные углы. Вам нужно будет установить начальный цвет в наконечнике.

- (void)setHighlighted:(BOOL)highlighted
{
    [super setHighlighted:highlighted];

    self.backgroundColor = (highlighted) ? [UIColor redColor] : [UIColor blueColor];
}
person Sean Kladek    schedule 10.09.2014