这个问题让我不知所措。
在 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]];
这可以通过编程来实现,制作一个副本:
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;
。 - DefenestrationDaysetBackgroundColor:(UIColor *) forState:(UIControlState)
。 - EthanBUIButtonTypeRoundedRect
类型的 UIButton?
你无法更改其背景颜色。当你尝试更改其背景颜色时,实际上是在更改按钮所绘制的矩形的颜色(通常是透明的)。
因此,有两种方法可行。一种是子类化 UIButton 并覆盖其 -drawRect:
方法,另一种是为不同的按钮状态创建图像(这样做是完全可以的)。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
绘制的路径。 - stigiforState:(UIControlStateHighlighted | UIControlStateSelected)
。干杯。 - NSTJ另一个可能的方法:
然而,按钮是正方形的,这不是我们想要的。创建一个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];
}
如果您不想使用图像并且希望它看起来与圆角矩形样式完全相同,请尝试以下方法。只需将UIView放在UIButton上方,具有相同的框架和自动调整大小掩码,将alpha设置为0.3,并将背景设置为颜色。然后使用下面的片段从着色覆盖视图中剪切圆角。此外,在IB上取消选中UIView上的“用户交互已启用”复选框,以允许触摸事件向下级联到下面的UIButton。
一个副作用是您的文本也会被着色。
#import <QuartzCore/QuartzCore.h>
colorizeOverlayView.layer.cornerRadius = 10.0f;
colorizeOverlayView.layer.masksToBounds = YES;
另一种可能性(我认为是最好和最美的):
在Interface Builder中创建一个具有2个片段的UISegmentedControl,并将其设置为所需的背景颜色。将类型设置为“bar”。然后,将其更改为仅具有一个片段。Interface builder不接受一个片段,因此您必须通过编程方式完成。
因此,在此按钮上创建一个IBOutlet,并将其添加到视图的viewDidLoad中:
[segmentedButton removeSegmentAtIndex:1 animated:NO];
我非常肯定你不能直接更改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];
[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];
}