Como posso definir uma cor de fundo do botão no iPhone?

Como posso definir uma cor de fundo personalizada de um botão?

O Interface Builder não parece ter uma interface para fazer isso.

Está disponível apenas de forma programática? Se assim for, você pode dar um exemplo, por favor?

Eu li sua pergunta para exigir (como eu) uma maneira programática de definir a cor do botão. É uma omissão gritante do UIKit, e eu não consegui fazer com que o UIGlassButton não documentado funcionasse.

Eu resolvi isso com um único segmento UISegmentedControl , que permite que você defina o 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]; 

Observe que as propriedades momentary e segmentedControlStyle são importantes e que uma imagem pode ser usada em vez de um nome NSString * .

Uma imagem elástica com tampas finais funciona bem se você pode usar um conjunto finito de imagens em lata, mas isso não se encheckbox no requisito! Por exemplo,

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

Eu descobri que precisava usar uma imagem elástica para fazer isso. O exemplo UICatalog da Apple tem um ou mais botões coloridos desenhados dessa maneira. Você pode usar a imagem do modelo e recolori-la para atender às suas necessidades de botão.

Não tenho certeza sobre como fazer isso no Interface Builder, mas consegui criar um botão e usar uma imagem para seu conteúdo usando o seguinte código:

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

Definir a cor do plano de fundo da visualização para um botão de arredondamento arredondado não alterará a cor do plano de fundo do botão. Tente tornar o botão um botão personalizado (a primeira lista suspensa no inspetor) e, em seguida, defina a cor do plano de fundo. Você terá o efeito desejado 🙂

Parece que a cor dos botões ainda é um problema. A categoria a seguir define o backgroundimage de um botão completamente programaticamente por meio de um método de instância que usa um parâmetro UIColor. Não há necessidade de criar arquivos de backgroundimage de botão. Ele preserva o comportamento dos botões com base no UIControlState. E mantém os cantos arredondados.

O arquivo de header UIButton + ColoredBackground.h

 #import  @interface UIButton (ColoredBackground) - (void)setBackgroundImageByColor:(UIColor *)backgroundColor forState:(UIControlState)state; @end 

e o conteúdo do UIButton + ColoredBackground.m

 #import "UIButton+ColoredBackground.h" #import  @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 

O novo método é justed chamado em cada instância do UIButton como:

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

http://github.com/dermdaly/ButtonMaker

Você pode gerar imagem UIbutton usando este aplicativo … e pode configurá-lo como imagem de fundo do seu botão

Defina o tipo de botão como “personalizado” na paleta de atributos do botão. Isto lhe dará um botão quadrado com qualquer cor que você escolheu para o fundo.

Se você quer um botão que se parece mais com um botão tradicional, mas tem uma cor diferente, você precisará ir a algum tipo de software de edição de imagem e criá-lo (eu uso o photoshop para botões personalizados).

Este link fornece uma solução elegante para o seu problema … http://www.cimgf.com/2010/01/28/fun-with-uibuttons-and-core-animation-layers/

Para manter o botão arredondado, que tal usar

 view.layer.cornerRadius = 8; 

descrito aqui

Como faço para criar um UILabel arredondado no iPhone?

Eu modifiquei um pouco a versão do código do @Patch. O problema para mim era que a versão antiga esticava o raio do canto suja ao trocar do modo retrato para paisagem. Então eu fiz essa versão usar o método stretchableImageWithLeftCapWidth: topCapHeight.

 #import "UIButton+ColoredBackground.h" #import  #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 

O uso não mudou. Parece mais claro agora nas bordas, e eu também adicei um gradiente para fazer mais plástico. mas você pode remover isso também.

Eu resolvi esse problema criando meu próprio botão no Fireworks. Eu desenhei um retângulo arredondado de aproximadamente o tamanho que eu queria, com a cor de preenchimento e cor da borda que eu queria. Apare a canvas e salve como um PNG. No XCode, adicione o arquivo à pasta Recursos. Você pode usar um botão Personalizado no Interface Builder e especificar a imagem como esse PNG. Ele irá redimensioná-lo conforme necessário, colocar o texto no topo, etc. A curva dos cantos pode distorcer se você precisar redimensioná-lo muito do original.

A solução de Tim James (um controle segmentado de segmento único) funcionou para mim quando eu queria um simples botão ‘Salvar’ com um degradê azul de fundo decente. Eu simplesmente criei um controle de 2 segmentos na ponta, configurei o primeiro segmento como eu queria e então removi o segundo segmento sob -viewWillAppear usando [mySegmentedControl removeSegmentAtIndex: 1 animated: NO]. Para os meus propósitos, ‘Momentary’ precisava estar ativo (marcado) para o primeiro segmento do Segmented Control na ponta e ‘Selected’ não estava ativo para nenhum dos segmentos. “Valor alterado” é a ação do controle segmentado para se conectar.

Aqui está um aplicativo gratuito que criei que cria imagens UIGlassButton. Defina o tipo de botão para personalizado. http://itunes.apple.com/us/app/uibutton-builder/id408204223?mt=8

Eu fiz isso da seguinte forma para criar botão como botão delete sistema como em 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]; 

libere todos os objects e importe QuartzCore / QuartzCore.he adicione essa estrutura ao seu projeto.

Aqui está uma variação da solução do @ user200212 (http://stackoverflow.com/a/8547424). Ele usa a class UIBezierCurve para preencher o botão e desenhar uma borda preta de 1px ao redor:

UIButton + ColoredBackground.h

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

UIButton + ColoridoBackground.m

 // UIButton+ColoredBackground.m #import "UIButton+ColoredBackground.h" #import  @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 

Uso:

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

keremk estava certo quando disse para mudar a cor de fundo da ‘visão’ quando você clicou no botão e entrou no inspetor. Isso muda os cantinhos para qualquer cor escolhida.

UIButton colorido

Se você não está querendo usar imagens, e quer que seja exatamente como o estilo Rounded Rect, tente isso. Basta colocar um UIView sobre o UIButton, com um quadro idêntico e máscara de redimensionamento automático, defina o alfa para 0.3 e defina o plano de fundo para uma cor. Em seguida, use o snippet abaixo para recortar as bordas arredondadas da visualização de sobreposição colorida. Além disso, desmarque a checkbox de seleção “User Interaction Enabled” no IB no UIView para permitir que os events de toque caiam em cascata no UIButton abaixo.

Um efeito colateral é que seu texto também será colorido.

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

Construindo ainda mais em @ Denny1989 Eu resolvi um problema ao obter erros (contexto inválido 0x0) ao configurar o botão em viewDidLoad. O botão precisa ser exibido antes de ter um tamanho e, portanto, não pode ser dependido até que a exibição apareça. Esta categoria adiciona uma cor para UIControlStateNormal. Se outros estados de controle forem necessários para seu aplicativo, você precisará adicioná-los de maneira semelhante à categoria.

 // UIButton+ColoredBackground.h #import  @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 

e

 // UIButton+ColoredBackground.m #import "UIButton+ColoredBackground.h" #import  #import  #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 

uso

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

Certifique-se de tornar o tipo de botão customizado ou drawRect não pode ser chamado.

Então, encontrei uma solução incrivelmente simples usando categorias. (Tão simples que acho que devo estar fazendo algo hacky, mas não vejo isso!)

Defina uma categoria (se você não sabe o que é isso, em resumo: é uma maneira de “estender” uma class minimamente; isto é, adicionar methods a uma class, mas nenhuma propriedade) para o UIButton e criar um método ” setBackgroundColor “que chama o método setBackgroundColor da super-class do UIButton (UIControl).

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

Onde quer que você use UIButtons, contanto que você importe o arquivo de header no qual esta categoria é declarada, neste caso,

 #import "coloredBackgroundButton.h" 

você pode chamar setBackgroundColor neles.

Pode ser que eu entendi mal sua pergunta, mas abaixo não funciona para você?