É possível alterar uma cor de fundo UIButtons?

Este me deixou perplexo.

É possível alterar a cor de fundo de um UIButton em Cocoa para iPhone? Eu tentei definir a cor de fundo, mas só muda os cantos. setBackgroundColor: parece ser o único método disponível para essas coisas.

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

Isso pode ser feito de forma programática, fazendo uma réplica:

  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; 

Editar: ofcourse, você teria que #import

edit: para todos os novos leitores, você também deve considerar algumas opções adicionadas como “outra possibilidade”. para sua consideração.

Como esta é uma resposta antiga, recomendo vivamente a leitura de comentários para a resolução de problemas

Eu tenho uma abordagem diferente

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

De 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; } 

Não se esqueça de #import

Eu suponho que você está falando sobre um UIButton com UIButtonTypeRoundedRect ? Você não pode mudar a cor de fundo disso. Quando você tenta mudar sua cor de fundo, você está mudando a cor do contorno no qual o botão é desenhado (o que geralmente é claro). Então, há dois caminhos a percorrer. Você subclass UIButton e sobrescreve seu método -drawRect: ou cria imagens para os diferentes estados dos botões (o que é perfeitamente adequado).

Se você definir as imagens de fundo no Interface Builder, você deve notar que o IB não suporta a configuração de imagens para todos os estados que o botão pode ter, então eu recomendo configurar as imagens no código da seguinte forma:

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

A última linha mostra como definir uma imagem para o estado selecionado e destacado (é o que o IB não pode definir). Você não precisa das imagens selecionadas (linhas 4 e 6) se o seu botão não precisar de um estado selecionado.

Outra possibilidade:

  1. Crie um construtor UIButton in Interface.
  2. Dê um tipo ‘Custom’
  3. Agora, no IB, é possível mudar a cor de fundo

No entanto, o botão é quadrado e não é isso que queremos. Crie um IBOutlet com uma referência a este botão e adicione o seguinte ao método viewDidLoad:

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

Não se esqueça de importar o QuartzCore.h

Métodos SubClass UIButton e override setHighlighted e 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]; } 

O meu método darkerShade está numa categoria UIColor como esta

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

Outra possibilidade (a melhor e mais bonita imho):

Crie um UISegmentedControl com 2 segmentos na cor de fundo necessária no Interface Builder. Defina o tipo como ‘bar’. Em seguida, mude para ter apenas um segmento. O construtor de interface não aceita um segmento, portanto, é necessário fazer isso de maneira programática.

Portanto, crie um IBOutlet para este botão e adicione isso ao viewDidLoad de sua view:

 [segmentedButton removeSegmentAtIndex:1 animated:NO]; 

Agora você tem um lindo botão colorido shiny com a cor de fundo especificada. Para ações, use o evento ‘value changed’.

(Eu encontrei isso em http://chris-software.com/index.php/2009/05/13/creating-a-nice-glass-buttons/ ). Obrigado Chris!

Bem eu sou 99% por cento positivo que você não pode simplesmente ir e mudar a cor de fundo de um UIButton. Em vez disso você tem que ir e mudar as imagens de fundo, o que eu acho que é uma dor. Estou espantado por ter feito isso.

Se eu estiver errado ou se houver uma maneira melhor sem ter que definir imagens de fundo, por favor me avise

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

Por sugestão @EthanB e @karim fazendo um retângulo preenchido por trás, eu acabei de criar uma categoria para o UIButton para conseguir isso.

Basta colocar o código de categoria: https://github.com/zmonteca/UIButton-PLColor

Uso:

 [button setBackgroundColor:uiTextColor forState:UIControlStateDisabled]; 

Opcional para os estados a serem usados:

 UIControlStateNormal UIControlStateHighlighted UIControlStateDisabled UIControlStateSelected 

Você também pode adicionar um CALayer ao botão – você pode fazer muitas coisas com estes, incluindo uma sobreposição de colors, este exemplo usa uma camada de cor simples, você também pode facilmente graduar a cor. Esteja ciente de que as camadas adicionadas obscurecem aquelas embaixo

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

adicione um segundo alvo para o UIButton para UIButton e altere a cor de segundo UIButton do UIButton . Em seguida, altere-o novamente no destino UIControlEventTouchUpInside ;

Para botões com aparência profissional e agradável, você pode verificar este componente de botão personalizado . Você pode usá-lo diretamente em suas visualizações e visualizações de canvas ou modificar o código-fonte para que ele atenda às suas necessidades. Espero que isto ajude.

Isso não é tão elegante quanto sub-classificar UIButton, no entanto, se você quer algo rápido – o que eu fiz foi criar botão personalizado, então uma imagem de 1px por 1px com a cor que eu gostaria que o botão fosse, e definir o plano de fundo do botão para essa imagem para o estado realçado – funciona para as minhas necessidades.

Eu sei que isso foi perguntado há muito tempo e agora há um novo UIButtonTypeSystem. Mas novas perguntas estão sendo marcadas como duplicatas desta pergunta, então aqui está minha nova resposta no contexto de um botão do sistema iOS 7, use a propriedade .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];

É possível mudar desta forma ou indo no Storyboard e mudar o fundo das opções no lado direito.

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)