是否可以更改UIButtons背景颜色?


105

这个让我难过。

是否有可能在iPhone的Cocoa中更改UIButton的背景颜色。我试过设置背景颜色,但它只会改变角落。setBackgroundColor:似乎是可用于此类事情的唯一方法。

[random setBackgroundColor:[UIColor blueColor]];
[random.titleLabel setBackgroundColor:[UIColor blueColor]];

您可以修复图像还是将其删除?kthx;)
stigi,2010年

o-0嗯.....,图像还不错,但现在不会再显示了。刚刚删除了它
dubbeat 2010年


我在previos帖子中解决了此问题,请检查链接[动态更改UIButton的边框或背景纹理] [1] [1]:stackoverflow.com/questions/9733213/…–
IMMORTAL

好的教程和示例代码在此处cimgf.com/2010/01/28/…–
Shamsudheen TK,

Answers:


160

这可以通过制作副本来以编程方式完成:

loginButton = [UIButton buttonWithType:UIButtonTypeCustom];
[loginButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
loginButton.backgroundColor = [UIColor whiteColor];
loginButton.layer.borderColor = [UIColor blackColor].CGColor;
loginButton.layer.borderWidth = 0.5f;
loginButton.layer.cornerRadius = 10.0f;

编辑:当然,您必须 #import <QuartzCore/QuartzCore.h>

编辑:对于所有新读者,您还应该考虑添加一些选项作为“另一种可能性”。供您考虑。

由于这是旧答案,因此我强烈建议您阅读注释以进行故障排除


这就是OP寻找的东西。
史蒂文

4
甜!在所有的解决方案中,我发现这是我所追求的。需要说明的是,制作“副本”是指使用Quartz在自定义按钮中绘制圆角矩形,而不是使用RoundedRect类型的按钮。起初,我认为这意味着以某种方式制作具有不同颜色的圆角矩形的副本,以模拟bg颜色的变化。
daver 2011年

1
工作完美,是OP的最佳答案。感谢分享。
Bram 2012年

@daver:这个答案太流行了,肯定有我所欠的优点。如何根据状态更改背景颜色?大概每次状态改变时,都必须显式改变背景色。按下我的按钮将被禁用,直到Web服务响应为止。在等待ws响应时,我是否必须在印刷时更改为突出显示颜色并且将计时器更改为禁用颜色?如果我错过了要点,请有人解释。谢谢波莉。
2012年

1
@Polly:对不起,您很快没有看到您的评论,但是如果您仍然有兴趣,这就是我最终要做的事情:子类UIButton并重写drawRect:使用一些UIBezierPaths绘制舍入的矩形。绘制后,使用CGGradientCreateWithColorComponents()用渐变填充。此函数的args之一是4元素浮点数组(对应于R,G,B和alpha)。我定义了2个颜色数组,每个状态一个,并根据按钮状态在drawRect中选择了一种。
daver

59

我有不同的方法,

[btFind setTitle:NSLocalizedString(@"Find", @"") forState:UIControlStateNormal];    
[btFind setBackgroundImage:[CommonUIUtility imageFromColor:[UIColor cyanColor]] 
        forState:UIControlStateNormal];
btFind.layer.cornerRadius = 8.0;
btFind.layer.masksToBounds = YES;
btFind.layer.borderColor = [UIColor lightGrayColor].CGColor;
btFind.layer.borderWidth = 1;

从CommonUIUtility,

+ (UIImage *) imageFromColor:(UIColor *)color {
    CGRect rect = CGRectMake(0, 0, 1, 1);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    //  [[UIColor colorWithRed:222./255 green:227./255 blue: 229./255 alpha:1] CGColor]) ;
    CGContextFillRect(context, rect);
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}

别忘了 #import <QuartzCore/QuartzCore.h>


2
好一个。我发现我必须添加一个btFind.layer.borderWidth = 1;
DefenestrationDay '02

我喜欢这种解决方案,但目前无法使用。我收到一个错误,因为找不到“ CommonUIUtility”。谷歌只是给我日食的东西,但我想应该在QuartzCore中吗?有任何想法吗?
Stephan '04

不,这是一个用户定义的类,用于在应用程序中执行常见的UI内容。您可以在自己的类中编写imageFromColor方法。
karim 2012年

1
闻起来像UIButton上的类别方法: setBackgroundColor:(UIColor *) forState:(UIControlState)
EthanB

3
太傻了,我们只能在iOS 7上使用,这仍然是添加背景色的最
简洁

32

我假设您正在谈论带有UIButtonTypeRoundedRect?的UIButton 。您不能更改其背景颜色。当您尝试更改其背景颜色时,您实际上是在更改绘制按钮的矩形的颜色(通常很明显)。因此,有两种方法。您可以继承UIButton并覆盖其-drawRect:方法,也可以为不同的按钮状态创建图像(这样做非常好)。

如果在Interface Builder中设置背景图像,您应该注意到IB不支持为按钮可以具有的所有状态设置图像,因此我建议使用如下代码设置图像:

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setBackgroundImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
[myButton setBackgroundImage:[UIImage imageNamed:@"disabled.png"] forState:UIControlStateDisabled];
[myButton setBackgroundImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateSelected];
[myButton setBackgroundImage:[UIImage imageNamed:@"higligted.png"] forState:UIControlStateHighlighted];
[myButton setBackgroundImage:[UIImage imageNamed:@"highlighted+selected.png"] forState:(UIControlStateHighlighted | UIControlStateSelected)];

最后一行显示了如何为选定和突出显示的状态设置图像(这是IB不能设置的)。如果您不需要按钮,则不需要选定的图像(第4行和第6行)。


感谢您的解释。只是一个简单的问题。如果我覆盖了drawrect方法,我猜想那会涉及到我使用图形库的情况?仅靠编程绘制圆角矩形并用颜色填充线条的线吗?
dubbeat 2010年

2
我只是对“ iphone drawrect圆角”做了一个简短的Google查询,发现了这一点:iphonedevelopment.blogspot.com/2008/11 / ... 检查drawrect方法中的示例如何绘制圆角rect。您可以使用CGContextSetFillColorWithColorCGContextFillPath填充绘制的路径CGContextAddArcToPoint
斯蒂吉,2010年

2
+50指出控制状态的位屏蔽潜力,即:forState:(UIControlStateHighlighted | UIControlStateSelected)干杯。
NSTJ 2014年

28

另一种可能性:

  1. 在“界面”构建器中创建一个UIButton。
  2. 为其输入“自定义”类型
  3. 现在,在IB中可以更改背景颜色

但是,按钮是方形的,这不是我们想要的。使用对此按钮的引用创建一个IBOutlet,并将以下内容添加到viewDidLoad方法中:

[buttonOutlet.layer setCornerRadius:7.0f];
[buttonOutlet.layer setClipToBounds:YES];

不要忘记导入QuartzCore.h


7
完美,谢谢!我不确定这是否是因为我使用的iOS版本(5.1),但setClipToBounds不可用。相反,我使用的是buttonOutlet.layer.masksToBounds = TRUE;
iforce2d 2012年

当我添加此代码时,它会显示一个圆角的矩形,但是当我单击它时,该按钮不会反向突出显示。到底是怎么回事?
2013年

这种方法的问题是您不能为按钮的突出显示状态设置背景色。
ch3rryc0ke 2013年

17

子类UIButton并重写setHighlighted和setSelected方法

-(void) setHighlighted:(BOOL)highlighted {

  if(highlighted) {
    self.backgroundColor = [self.mainColor darkerShade];
  } else {
    self.backgroundColor = self.mainColor;
  }
  [super setHighlighted:highlighted];
}

-(void) setSelected:(BOOL)selected {

  if(selected) {
    self.backgroundColor = [self.mainColor darkerShade];
  } else {
    self.backgroundColor = self.mainColor;
  }
  [super setSelected:selected];
}

我的darkerShade方法在这样的UIColor类别中

-(UIColor*) darkerShade {

  float red, green, blue, alpha;
  [self getRed:&red green:&green blue:&blue alpha:&alpha];

  double multiplier = 0.8f;
  return [UIColor colorWithRed:red * multiplier green:green * multiplier blue:blue*multiplier alpha:alpha];
}

7

彩色的UIButton

如果您不想使用图像,并希望它看起来完全像Rounded Rect样式,请尝试此操作。只需将UIView放在具有相同框架和自动调整大小蒙版的UIButton上,将alpha设置为0.3,并将背景设置为颜色。然后使用下面的代码片段将圆形边缘从彩色叠加视图上剪切下来。同样,在UIView的IB中取消选中“启用用户交互”复选框,以允许触摸事件向下层叠到下面的UIButton。

副作用是您的文本也将被着色。

#import <QuartzCore/QuartzCore.h>

colorizeOverlayView.layer.cornerRadius = 10.0f;
colorizeOverlayView.layer.masksToBounds = YES;

7

另一种可能性(最好和最漂亮的恕我直言):

在Interface Builder中用所需的背景颜色创建带有2个细分的UISegmentedControl。将类型设置为“酒吧”。然后,将其更改为仅包含一个细分。界面生成器不接受一个细分,因此您必须以编程方式进行。

因此,为此按钮创建一个IBOutlet并将其添加到视图的viewDidLoad中:

[segmentedButton removeSegmentAtIndex:1 animated:NO];

现在,您将获得一个具有指定背景色的漂亮的彩色光泽按钮。对于操作,请使用“值已更改”事件。

(我已经在http://chris-software.com/index.php/2009/05/13/creating-a-nice-glass-buttons/上找到了它)。谢谢克里斯!


5

好吧,我有99%的肯定表示您不能直接更改UIButton的背景颜色。相反,您必须自己去更改背景图像,我认为这很痛苦。我很惊讶我不得不这样做。

如果我错了,或者有更好的方法无需设置背景图片,请告诉我

[random setBackgroundImage:[UIImage imageNamed:@"toggleoff.png"] forState:UIControlStateNormal];
    [random setTitleColor:[UIColor darkTextColor] forState:UIControlStateNormal];


[random setBackgroundImage:[UIImage imageNamed:@"toggleon.png"] forState:UIControlStateNormal];
    [random setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

5
你是绝对正确的。这是一种痛苦,需要花几分钟的时间来完成而不是创建图像的麻烦。另外,如果您的按钮是圆形的,它也将变得更难做……真是太痛苦了。
Henley Chiu

2

通过@EthanB建议和@karim制作一个回填矩形,我刚刚为UIButton创建了一个类别来实现此目的。

只需输入类别代码: https //github.com/zmonteca/UIButton-PLColor

用法:

[button setBackgroundColor:uiTextColor forState:UIControlStateDisabled];

供使用的可选国家:

UIControlStateNormal
UIControlStateHighlighted
UIControlStateDisabled
UIControlStateSelected

2

您还可以在按钮上添加CALayer-您可以使用这些按钮进行很多操作,包括颜色叠加,此示例使用了纯色图层,您还可以轻松地对颜色进行渐变。请注意,尽管添加的层遮盖了下面的那些层

+(void)makeButtonColored:(UIButton*)button color1:(UIColor*) color
{

    CALayer *layer = button.layer;
    layer.cornerRadius = 8.0f;
    layer.masksToBounds = YES;
    layer.borderWidth = 4.0f;
    layer.opacity = .3;//
    layer.borderColor = [UIColor colorWithWhite:0.4f alpha:0.2f].CGColor;

    CAGradientLayer *colorLayer = [CAGradientLayer layer];
    colorLayer.cornerRadius = 8.0f;
    colorLayer.frame = button.layer.bounds;
    //set gradient colors
    colorLayer.colors = [NSArray arrayWithObjects:
                         (id) color.CGColor,
                         (id) color.CGColor,
                         nil];

    //set gradient locations
    colorLayer.locations = [NSArray arrayWithObjects:
                            [NSNumber numberWithFloat:0.0f],
                            [NSNumber numberWithFloat:1.0f],
                            nil];


    [button.layer addSublayer:colorLayer];

}

辉煌!!!!!!但是无法针对同一按钮多次调用。可以,但是一次又一次添加新图层。
Valeriy Van

@StanJames:对代码的编辑应通过注释(或适当的话,由您自己的答案)建议。
mafso 2014年

1

添加第二个目标为UIButton用于UIControlEventTouched和改变UIButton背景颜色。然后将其更改回UIControlEventTouchUpInside目标;



1

这不像子类化UIButton那样优雅,但是,如果您只想快速进行操作-我所做的就是创建自定义按钮,然后创建一个1px x 1px的图像,其颜色是我希望按钮的颜色,并设置背景该图像按钮的突出显示状态-适用于我的需求。


1

我知道这是很久以前问过的,现在有了一个新的UIButtonTypeSystem。但是较新的问题被标记为该问题的重复项,因此这是在iOS 7系统按钮的上下文中我的较新答案,请使用.tintColor属性。

let button = UIButton(type: .System)
button.setTitle("My Button", forState: .Normal)
button.tintColor = .redColor()

0

[myButton setBackgroundColor:[UIColor blueColor]]; [myButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

可以通过这种方式或在Storyboard上进行更改,并更改右侧选项的背景。


0

斯威夫特3:

        static func imageFromColor(color: UIColor, width: CGFloat, height: CGFloat) -> UIImage {
            let rect = CGRect(x: 0, y: 0, width: width, height: height)
            UIGraphicsBeginImageContext(rect.size)
            let context = UIGraphicsGetCurrentContext()!
            context.setFillColor(color.cgColor)
            context.fill(rect)
            let img = UIGraphicsGetImageFromCurrentImageContext()!
            UIGraphicsEndImageContext()
            return img
        }

        let button = UIButton(type: .system)
        let image = imageFromColor(color: .red, width: 
        button.frame.size.width, height: button.frame.size.height)
        button.setBackgroundImage(image, for: .normal)

如果您说了如何调用或使用此处编写的代码,这将是一个非常有用的答案。是否进入UIButton扩展?
Michael Dautermann
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.