是否有可能更改UIButtons背景颜色?

这一个让我难住。

是否有可能在iOScocoa改变UIButton的背景颜色。 我已经尝试设置背景颜色,但它只是改变了angular落。 setBackgroundColor:似乎是唯一可用于这种事情的方法。

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

这可以通过编制一个副本来完成:

  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; 

编辑:ofcourse,你必须#import <QuartzCore/QuartzCore.h>

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

由于这是一个旧的答案,我强烈build议阅读意见进行故障排除

我有一个不同的方法,

 [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; 

从通用性,

 + (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>

我假设你正在谈论与UIButtonTypeRoundedRect ? 你不能改变它的背景颜色。 当你尝试改变它的背景颜色,你就是改变矩形的颜色,这个button被绘制(通常是清晰的)。 所以有两种方法。 要么是-drawRect: UIButton并覆盖它的-drawRect:方法,要么为不同的button状态创build图像(这是完美的)。

如果你在界面生成器中设置背景图像,你应该注意到IB不支持为button可以具有的所有状态设置图像,所以我build议将图像设置为这样的代码:

 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不能设置)设置图像。 你不需要select的图像(第4和第6行),如果你是button,不需要选定的状态。

另一种可能性

  1. 在“界面”构build器中创build一个UIButton。
  2. 给它一个types“自定义”
  3. 现在,在IB中可以更改背景颜色

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

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

不要忘记导入QuartzCore.h

子类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]; } 

彩色的UIButton

如果您不想使用图像,并且希望它看起来完全像Rounded Rect样式,请尝试此操作。 只需将UIView放在UIButton上,使用相同的框架和自动resize的蒙版,将Alpha设置为0.3,然后将背景设置为一种颜色。 然后使用下面的代码片段将彩色覆盖视图中的圆angular边缘剪下。 另外,取消选中UIView中的“User Interaction Enabled”checkbox,以允许触摸事件级联到下面的UIButton。

一个副作用是你的文字也会被彩色化。

 #import <QuartzCore/QuartzCore.h> colorizeOverlayView.layer.cornerRadius = 10.0f; colorizeOverlayView.layer.masksToBounds = YES; 

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

在Interface Builder中使用所需的背景颜色创build一个带有两段的UISegmentedControl。 将types设置为“bar”。 然后,将其更改为只有一个段。 接口生成器不接受一个段,所以你必须以编程方式进行。

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

 [segmentedButton removeSegmentAtIndex:1 animated:NO]; 

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

(我发现http://chris-software.com/index.php/2009/05/13/creating-a-nice-glass-buttons/ )。 谢谢Chris!

那么我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]; 

你也可以添加一个CALayer到button – 你可以做很多事情,包括颜色叠加,这个例子使用一个简单的颜色层,你也可以很容易地gradle的颜色。 请注意,虽然添加的图层隐藏了下面的图层

 +(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]; } 

每@EthanBbuild议和@ karim使一个回填矩形,我刚刚创build了一个UIButton类来实现这一目标。

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

用法:

 [button setBackgroundColor:uiTextColor forState:UIControlStateDisabled]; 

可选的状态使用:

 UIControlStateNormal UIControlStateHighlighted UIControlStateDisabled UIControlStateSelected 

UIControlEventTouchedUIButton添加第二个目标并更改UIButton背景颜色。 然后将其更改回UIControlEventTouchUpInside目标中;

对于专业和漂亮的button,你可以检查这个自定义button组件 。 您可以直接在视图和表格中使用它,或修改源代码以使其满足您的需求。 希望这可以帮助。

这不像子类UIButton那样优雅,但是如果你只是想快速的东西 – 我做的是创build自定义button,然后1px的图像与颜色我希望button,并设置背景突出显示状态的图像button – 适合我的需求。

我知道这是很久以前问的,现在有一个新的UIButtonTypeSystem。 但更新的问题被标记为这个问题的重复,所以这里是我在iOS 7系统button的上下文中的新答案,使用.tintColor属性。

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

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

有可能改变这种方式或继续Storyboard并改变右侧选项的背景。

Swift 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)