如何在高亮时更改UIButton的背景颜色,但保留layer的圆角?

7

我通过这个分类方法,使用1像素乘1像素的图像来改变UIButton的背景颜色:

- (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。我需要一个带圆角的按钮,但也需要一个可以在突出显示时更改背景颜色的按钮。
有什么解决办法吗?圆角半径需要是动态的。

为什么你要用图片来设置背景颜色,而不是使用UIColor呢?如果你的图片是1像素x1像素,那它已经是一个纯色了。或者,你可以使用UIColor方法colorWithPatternImage:。 - Sean Kladek
我需要设置高亮状态的背景颜色,UIKit没有提供这样做的方法,因此使用了类别。然而,用这种方式会破坏圆角,这就是我需要解决的问题。 - Luke
2个回答

16

所以,我所需要做的就是确保button.layer.masksToBounds已经打开。问题解决了,不需要子类化。


2

继承UIButton类。在您的子类中,在init方法中设置圆角半径。如果您使用xib,则应该使用initWithDecoder:

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

    return self;
}

还需要子类化setHighlighted:方法。这是您设置背景颜色的地方。检查“highlighted”值并适当地分配背景颜色。在此示例中,按钮是一个带圆角的蓝色按钮,在高亮时变为红色。您需要在nib中设置初始颜色。

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

    self.backgroundColor = (highlighted) ? [UIColor redColor] : [UIColor blueColor];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接