如何在iPhone上设置button背景颜色?

我怎样才能设置一个button的自定义背景颜色?

界面生成器似乎没有一个接口来做到这一点。

它只能以编程方式提供吗? 如果是这样,请你举个例子吗?

我读你的问题要求 (像我这样)设置button颜色的程序化方式。 这是从UIKit明显的遗漏,我无法得到无证的UIGlassButton工作。

我已经解决了这个单段UISegmentedControl ,它允许你设置tintColor

 UISegmentedControl * btn = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:name]]; btn.momentary = YES; btn.segmentedControlStyle = UISegmentedControlStyleBar; btn.tintColor = color; [btn addTarget:self action:@selector(action:) forControlEvents:UIControlEventValueChanged]; 

请注意, momentarysegmentedControlStyle属性是重要的,并且可以使用图像而不是NSString *名称。

如果您可以使用有限的固定图像集,可以使用带有端盖的可拉伸图像,但是这不符合要求! 例如,

 buttonImage = [[UIImage imageNamed:@"button.png"] stretchableImageWithLeftCapWidth:26 topCapHeight:16]; 

我发现我需要使用一个可拉伸的图像来实现这一点。 苹果的UICatalog示例有一个或多个以这种方式绘制的彩色button。 你可以使用他们的模板图像,并重新着色,以适应你的button需求。

我不确定在Interface Builder中这样做,但我可以使用下面的代码创build一个button并使用一个图像作为它的内容:

 downloadButton = [[UIButton alloc] initWithFrame:CGRectMake(36, 212, 247, 37)]; downloadButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; downloadButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; [downloadButton setTitle:NSLocalizedStringFromTable(@"Download", @"Localized", nil) forState:UIControlStateNormal]; [downloadButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [downloadButton setFont:[UIFont boldSystemFontOfSize:14.0]]; UIImage *newImage = [[UIImage imageNamed:@"greenButton.png"] stretchableImageWithLeftCapWidth:12.0f topCapHeight:0.0f]; [downloadButton setBackgroundImage:newImage forState:UIControlStateNormal]; [downloadButton addTarget:self action:@selector(downloadNewItem) forControlEvents:UIControlEventTouchDown]; downloadButton.backgroundColor = [UIColor clearColor]; [downloadDisplayView addSubview:downloadButton]; 

设置圆angularbutton视图的背景颜色不会改变button的背景颜色。 尝试使button成为自定义button(检查器中的第一个下拉列表),然后设置背景颜色。 你会得到期望的效果:)

看来,button颜色仍然是一个问题。 以下类别通过采用UIColor参数的实例方法完全以编程方式设置button的backgroundimage。 没有必要创buildbutton的背景图像文件。 它保留了基于UIControlState的button行为。 它保持圆angular。

头文件UIButton + ColoredBackground.h

 #import <UIKit/UIKit.h> @interface UIButton (ColoredBackground) - (void)setBackgroundImageByColor:(UIColor *)backgroundColor forState:(UIControlState)state; @end 

和UIButton + ColoredBackground.m的内容

 #import "UIButton+ColoredBackground.h" #import <QuartzCore/QuartzCore.h> @implementation UIButton (ColoredBackground) - (void)setBackgroundImageByColor:(UIColor *)backgroundColor forState:(UIControlState)state{ // tcv - temporary colored view UIView *tcv = [[UIView alloc] initWithFrame:self.frame]; [tcv setBackgroundColor:backgroundColor]; // set up a graphics context of button's size CGSize gcSize = tcv.frame.size; UIGraphicsBeginImageContext(gcSize); // add tcv's layer to context [tcv.layer renderInContext:UIGraphicsGetCurrentContext()]; // create background image now UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); // set image as button's background image for the given state [self setBackgroundImage:image forState:state]; UIGraphicsEndImageContext(); // ensure rounded button self.clipsToBounds = YES; self.layer.cornerRadius = 8.0; [tcv release]; } @end 

新方法是每个UIButton实例调用,如下所示:

 [myButton setBackgroundImageByColor:[UIColor greenColor] forState:UIControlStateNormal]; 

http://github.com/dermdaly/ButtonMaker

您可以使用此应用程序生成UIbutton图像…并可以将其设置为您的button的背景图像

在button属性面板中将您的buttontypes设置为“自定义”。 这会给你一个方形的button,无论你select什么颜色的背景。

如果你想要一个看起来更像一个传统button,但有不同的颜色的button,你需要进入某种图像编辑软件,并创build它(我使用Photoshop的自定义button)。

此链接为您的问题提供了一个优雅的解决scheme… http://www.cimgf.com/2010/01/28/fun-with-uibuttons-and-core-animation-layers/

为了保持button圆润,怎么样使用

 view.layer.cornerRadius = 8; 

在这里描述

如何在iPhone上创build一个圆angular的UILabel?

我有一点修改@Patch的代码版本。 对于我来说,问题是当从纵向模式切换到横向模式时,旧版本拉伸了angular落半径types的脏。 所以我做了这个版本使用stretchableImageWithLeftCapWidth:topCapHeight方法。

 #import "UIButton+ColoredBackground.h" #import <QuartzCore/QuartzCore.h> #define kCornerRadius 8.0f #define kStrokeColor [UIColor blackColor] #define kStrokeWidth 1.0f @implementation UIButton (ColoredBackground) - (void)setBackgroundImageByColor:(UIColor *)backgroundColor forState:(UIControlState)state{ CGSize gcSize = CGSizeMake(2*kCornerRadius +1, self.bounds.size.height); UIGraphicsBeginImageContext(gcSize); CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeOverlay); CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB(); UIColor *gradientStart = [UIColor colorWithRed:0.80 green:0.80 blue:0.80 alpha:0.2]; UIColor * gradientEnd = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.2]; NSArray *colors = [NSArray arrayWithObjects:(id)gradientStart.CGColor, (id)gradientEnd.CGColor, nil]; CGFloat locations[2] = { 0.0f, 1.0f }; CGGradientRef _gradient = CGGradientCreateWithColors(rgb, (__bridge CFArrayRef)colors, locations); CGColorSpaceRelease(rgb); CGContextDrawLinearGradient(UIGraphicsGetCurrentContext(), _gradient, CGPointMake(0.0, kStrokeWidth), CGPointMake(0.0, self.bounds.size.height-kStrokeWidth), 0); UIBezierPath *outsideEdge = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0.0, 0.0, gcSize.width, gcSize.height) cornerRadius:kCornerRadius]; [backgroundColor setFill]; [kStrokeColor setStroke]; outsideEdge.lineWidth = kStrokeWidth; [outsideEdge stroke]; [outsideEdge fill]; // Create the background image UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // Set image as button's background image (stretchable) for the given state [self setBackgroundImage:[image stretchableImageWithLeftCapWidth:kCornerRadius topCapHeight:0.0] forState:state]; // Ensure rounded button self.clipsToBounds = YES; self.layer.cornerRadius = kCornerRadius; } @end 

用法没有改变。 现在在边缘看起来更清晰了,我也渐渐渐渐变得更加塑料。 但是你也可以删除它。

我通过在Fireworks中创build自己的button来解决这个问题。 我画了一个我想要的大小的圆angular矩形,用我想要的填充颜色和边框颜色。 修剪canvas,并保存为PNG。 在XCode中,将该文件添加到资源文件夹。 您可以在Interface Builder中使用“自定义”button,并将该图像指定为该PNG。 它会根据需要resize,将文本放在顶部等等。如果您不得不调整原始大小,可能会导致拐angular曲线变形。

Tim James的解决scheme(单段分段控制)为我工作,当我想要一个简单的“保存”button,一个体面的蓝色渐变背景。 我只是在笔尖中创build了一个2段控件,根据需要设置了第一个段,然后使用[mySegmentedControl removeSegmentAtIndex:1 animated:NO]以编程方式删除了-viewWillAppear下的第二个段。 为了我的目的,对于分段控件的笔尖中的第一个分段,需要激活(勾选)“Momentary”,并且“Selected”对于任一分段都不是活动的。 “价值改变”是分段控制的行动连接起来。

这是我创build的一个免费的应用程序,它创buildUIGlassButton图像。 将buttontypes设置为自定义。 http://itunes.apple.com/us/app/uibutton-builder/id408204223?mt=8

我做了如下创buildbutton像系统删除button在uitableview中

 UIButton *h=[[UIButton alloc]init]; [[h layer] setCornerRadius:8.0f]; [[h layer] setMasksToBounds:YES]; [[h layer] setBorderWidth:1.0f]; CAGradientLayer *gradientLayer = [[CAGradientLayer alloc] init]; [gradientLayer setBounds:[h bounds]]; [gradientLayer setPosition:CGPointMake([h bounds].size.width/2, [h bounds].size.height/2)]; [gradientLayer setColors:[NSArray arrayWithObjects: (id)[[UIColor darkGrayColor]CGColor],(id)[[UIColor blackColor] CGColor], nil]]; [[h layer] insertSublayer:gradientLayer atIndex:0]; 

释放所有对象并导入QuartzCore / QuartzCore.h并将此框架添加到您的项目中。

这是@ user200212解决scheme的变体(http://stackoverflow.com/a/8547424)。; 它使用UIBezierCurve类来填充button并在其周围绘制1px黑色边框:

的UIButton + ColoredBackground.h

 // UIButton+ColoredBackground.h #import <UIKit/UIKit.h> @interface UIButton (ColoredBackground) - (void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state; + (UIColor *) silverColor; @end 

的UIButton + ColoredBackground.m

 // UIButton+ColoredBackground.m #import "UIButton+ColoredBackground.h" #import <QuartzCore/QuartzCore.h> @implementation UIButton (UIButton_ColoredBackground) - (void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state{ CGSize gcSize = self.bounds.size; UIGraphicsBeginImageContext(gcSize); // Create a Bezier Path around the button, and fill it with the background color UIBezierPath *outsideEdge = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:8.0f]; [backgroundColor setFill]; [[UIColor blackColor] setStroke]; outsideEdge.lineWidth = 1.0; [outsideEdge fill]; [outsideEdge stroke]; // Create the background image UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // Set image as button's background image for the given state [self setBackgroundImage:image forState:state]; // Ensure rounded button self.clipsToBounds = YES; self.layer.cornerRadius = 8.0; } @end 

用法:

 [myButton setBackgroundImageByColor:[UIColor greenColor] forState:UIControlStateNormal]; 

keremk是正确的,当他说,当你点击button,并进入检查员,改变“视图”的背景颜色。 这将小angular落改变成你select的颜色。

彩色的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; 

在@ Denny1989上进一步构build我已经解决了在viewDidLoad中设置button时出现错误(无效上下文0x0)的问题。 button需要在尺寸之前进行布局,因此在视图出现之前不能依赖。 这个类别为UIControlStateNormal添加一个颜色。 如果您的应用程序需要其他控件状态,则需要将其类似地添加到类别中。

 // UIButton+ColoredBackground.h #import <UIKit/UIKit.h> @interface UIButton (ColoredBackground) @property (nonatomic, retain) UIColor *buttonColorNormal; @property (nonatomic, retain) NSNumber *madeBackgroundImages; - (void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state; - (void)drawRect:(CGRect)rect; - (void)awakeFromNib; @end 

 // UIButton+ColoredBackground.m #import "UIButton+ColoredBackground.h" #import <QuartzCore/QuartzCore.h> #import <objc/runtime.h> #define kCornerRadius 8.0f #define kStrokeColor [UIColor darkGrayColor] #define kStrokeWidth 1.0f @implementation UIButton (ColoredBackground) static char UIB_ButtonColorNormal_KEY; static char UIB_MadeBackgroundImages_KEY; @dynamic buttonColorNormal; -(void)setButtonColorNormal:(NSObject *)buttonColorNormal { objc_setAssociatedObject(self, &UIB_ButtonColorNormal_KEY, buttonColorNormal, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -(NSObject*)buttonColorNormal { return (NSObject*)objc_getAssociatedObject(self, &UIB_ButtonColorNormal_KEY); } @dynamic madeBackgroundImages; -(void)setMadeBackgroundImages:(NSObject *)madeBackgroundImages { objc_setAssociatedObject(self, &UIB_MadeBackgroundImages_KEY, madeBackgroundImages, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -(NSObject*)madeBackgroundImages { return (NSObject*)objc_getAssociatedObject(self, &UIB_MadeBackgroundImages_KEY); } - (void)awakeFromNib { [self setMadeBackgroundImages:[NSNumber numberWithBool:FALSE]]; [super awakeFromNib]; } - (void)drawRect:(CGRect)rect { // if background images were not created from color do so here // if self.buttonColorNormal is not set behaves like normal button if ((self.buttonColorNormal)&&(![[self madeBackgroundImages] boolValue])) { [self setBackgroundColor:[self buttonColorNormal] forState:UIControlStateNormal]; [self setMadeBackgroundImages:[NSNumber numberWithBool:TRUE]]; } [super drawRect:rect]; } - (void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state { gcSize = CGSizeMake(2*kCornerRadius +1, self.bounds.size.height); UIGraphicsBeginImageContext(gcSize); CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB(); UIColor *gradientStart = [UIColor colorWithRed:0.80 green:0.80 blue:0.80 alpha:0.2]; UIColor * gradientEnd = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5]; NSArray *colors = [NSArray arrayWithObjects:(id)gradientStart.CGColor, (id)gradientEnd.CGColor, nil]; CGFloat locations[2] = { 0.0f, 1.0f }; CGGradientRef _gradient = CGGradientCreateWithColors(rgb, (__bridge CFArrayRef)colors, locations); CGColorSpaceRelease(rgb); CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeOverlay); CGContextDrawLinearGradient(UIGraphicsGetCurrentContext(), _gradient, CGPointMake(0.0, kStrokeWidth), CGPointMake(0.0, self.bounds.size.height-kStrokeWidth), 0); UIBezierPath *outsideEdge = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0.0, 0.0, gcSize.width, gcSize.height) cornerRadius:kCornerRadius]; [backgroundColor setFill]; [kStrokeColor setStroke]; outsideEdge.lineWidth = kStrokeWidth; [outsideEdge stroke]; [outsideEdge fill]; CFRelease(_gradient); // Create the background image UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // Set image as button's background image (stretchable) for the given state [self setBackgroundImage:[image stretchableImageWithLeftCapWidth:kCornerRadius topCapHeight:0.0] forState:state]; // Ensure rounded button self.clipsToBounds = YES; self.layer.cornerRadius = kCornerRadius; // add colored border self.layer.borderColor = kStrokeColor.CGColor; self.layer.borderWidth = kStrokeWidth; } @end 

用法

 - (void)viewDidLoad { [myButton setButtonColorNormal:[UIColor redColor]]; } 

一定要使buttontypes自定义或drawRect可能不会被调用。

所以,我发现了一个使用类别的非常简单的解决scheme。 (很简单,我认为我一定在做一些哈克,但是我没有看到它!)

定义一个类(如果你不知道这是什么,总结一下:这是一种最小化扩展类的方法;也就是说,为UIButton添加方法但没有属性),并创build一个方法“ setBackgroundColor“调用UIButton的超类”(UIControl)setBackgroundColor方法。

 @implementation UIButton (coloredBackgroundButton) -(void)setBackgroundColor:(UIColor *)backgroundColor { [super setBackgroundColor:backgroundColor]; } 

无论你在哪里使用UIButtons,只要你导入声明这个类别的头文件,在这种情况下,

 #import "coloredBackgroundButton.h" 

你可以在它们上面调用setBackgroundColor。

可能是我误解了你的问题,但下面不适合你吗?

替代文字http://img.skitch.com/20081216-fgi9eew577fncx2k3bbw3yc28d.png