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

时间:2010-05-11 07:49:58

标签: objective-c iphone cocoa-touch uibutton

这个让我难过。

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

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

17 个答案:

答案 0 :(得分:158)

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

    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>

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

由于这是一个陈旧的答案,我强烈建议您阅读用于排查的评论

答案 1 :(得分: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 :(得分: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)];

最后一行显示如何为所选&amp;突出显示的状态(这是IB无法设置的状态)。 如果按钮不需要选择状态,则不需要选择的图像(第4行和第6行)。

答案 3 :(得分:28)

另一种可能性:

  1. 在“界面”构建器中创建UIButton。
  2. 为其提供“自定义”类型
  3. 现在,在IB中可以更改背景颜色
  4. 然而,按钮是方形的,这不是我们想要的。使用对此按钮的引用创建一个IBOutlet,并将以下内容添加到viewDidLoad方法中:

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

    不要忘记导入QuartzCore.h

答案 4 :(得分: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];
}

答案 5 :(得分:7)

colored UIButton

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

一个副作用是你的文字也会着色。

#import <QuartzCore/QuartzCore.h>

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

答案 6 :(得分:7)

另一种可能性(最好和最美丽的imho):

在Interface Builder中创建一个UISegmentedControl,其中包含2个所需背景颜色的段。将类型设置为“bar”。然后,将其更改为只有一个段。 “接口”构建器不接受一个段,因此您必须以编程方式执行此操作。

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

[segmentedButton removeSegmentAtIndex:1 animated:NO];

现在你有一个美丽的光泽彩色按钮,具有指定的背景颜色。 对于操作,请使用“值已更改”事件。

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

答案 7 :(得分:5)

嗯,我百分之九十九,你不能只是去改变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];

答案 8 :(得分: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];

}

答案 9 :(得分:2)

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

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

用法:

[button setBackgroundColor:uiTextColor forState:UIControlStateDisabled];

可选的forStates:

UIControlStateNormal
UIControlStateHighlighted
UIControlStateDisabled
UIControlStateSelected

答案 10 :(得分:1)

UIButton的{​​{1}}添加第二个目标,并更改UIControlEventTouched背景颜色。然后将其更改回UIButton目标;

答案 11 :(得分:1)

对于专业且美观的按钮,您可以查看custom button component。您可以直接在视图和表格视图中使用它,也可以修改源代码以满足您的需求。希望这会有所帮助。

答案 12 :(得分:1)

这不像UIButton子类那样优雅,但是如果你只是想要快速的东西 - 我所做的就是创建自定义按钮,然后是1px x 1xx图像,颜色是我想要按钮的颜色,以及将按钮的背景设置为该图像以突出显示状态 - 适合我的需要。

答案 13 :(得分:1)

我知道这是很久以前的问题,现在有一个新的UIButtonTypeSystem。但是更新的问题被标记为这个问题的重复,所以这是我在iOS 7系统按钮上下文中的新答案,使用 <input type="radio" allow="true" value="I understand and agree to the rules of the Turning Points Essay Contest (you must agree to proceed with registration)" name="consent"><label>I understand and agree to the rules of the Turning Points Essay Contest (you must agree to proceed with registration)</label> <br /> <input type="radio" allow="false" name="consent" value="No, I do not agree with the rules of the Turning Points Essay Contest"><label>No, I do not understand</label> </form> <div class="button">button</div> $("input:radio").change(function() { $(".button").toggle($(this).attr("allow")); }); 属性。

.tintColor

答案 14 :(得分:0)

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

可以通过这种方式进行更改,也可以继续使用Storyboard并更改右侧选项的背景。

答案 15 :(得分: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)

答案 16 :(得分:0)

对于 iOS 15+,Apple 提供了一个简单的按钮配置来实现这一点。

目标-C:

randomButton.configuration = [UIButtonConfiguration filledButtonConfiguration];

斯威夫特:

randomButton.configuration = .filled()