这个让我难过。
是否有可能在iPhone的Cocoa中更改UIButton的背景颜色。我试过设置背景颜色,但它只会改变角落。setBackgroundColor:
似乎是可用于此类事情的唯一方法。
[random setBackgroundColor:[UIColor blueColor]];
[random.titleLabel setBackgroundColor:[UIColor blueColor]];
这个让我难过。
是否有可能在iPhone的Cocoa中更改UIButton的背景颜色。我试过设置背景颜色,但它只会改变角落。setBackgroundColor:
似乎是可用于此类事情的唯一方法。
[random setBackgroundColor:[UIColor blueColor]];
[random.titleLabel setBackgroundColor:[UIColor blueColor]];
Answers:
这可以通过制作副本来以编程方式完成:
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>
编辑:对于所有新读者,您还应该考虑添加一些选项作为“另一种可能性”。供您考虑。
由于这是旧答案,因此我强烈建议您阅读注释以进行故障排除
我有不同的方法,
[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>
btFind.layer.borderWidth = 1;
setBackgroundColor:(UIColor *) forState:(UIControlState)
。
我假设您正在谈论带有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行)。
CGContextSetFillColorWithColor
和CGContextFillPath
填充绘制的路径CGContextAddArcToPoint
。
forState:(UIControlStateHighlighted | UIControlStateSelected)
干杯。
另一种可能性:
但是,按钮是方形的,这不是我们想要的。使用对此按钮的引用创建一个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];
}
如果您不想使用图像,并希望它看起来完全像Rounded Rect样式,请尝试此操作。只需将UIView放在具有相同框架和自动调整大小蒙版的UIButton上,将alpha设置为0.3,并将背景设置为颜色。然后使用下面的代码片段将圆形边缘从彩色叠加视图上剪切下来。同样,在UIView的IB中取消选中“启用用户交互”复选框,以允许触摸事件向下层叠到下面的UIButton。
副作用是您的文本也将被着色。
#import <QuartzCore/QuartzCore.h>
colorizeOverlayView.layer.cornerRadius = 10.0f;
colorizeOverlayView.layer.masksToBounds = YES;
另一种可能性(最好和最漂亮的恕我直言):
在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/上找到了它)。谢谢克里斯!
好吧,我有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];
通过@EthanB建议和@karim制作一个回填矩形,我刚刚为UIButton创建了一个类别来实现此目的。
只需输入类别代码: https //github.com/zmonteca/UIButton-PLColor
用法:
[button setBackgroundColor:uiTextColor forState:UIControlStateDisabled];
供使用的可选国家:
UIControlStateNormal
UIControlStateHighlighted
UIControlStateDisabled
UIControlStateSelected
您还可以在按钮上添加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];
}
[myButton setBackgroundColor:[UIColor blueColor]];
[myButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
可以通过这种方式或在Storyboard上进行更改,并更改右侧选项的背景。
斯威夫特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)