objective c - guidelines - É possível alterar uma cor de fundo UIButtons?




xcode view (11)

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

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

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 resposta mais recente 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()

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 <QuartzCore/QuartzCore.h>


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


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

Meu método darkerShade está em uma 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];
}

Outra possibilidade (o melhor e mais lindo imho):

Crie um UISegmentedControl com 2 segmentos na cor de segundo plano 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 da sua view:

[segmentedButton removeSegmentAtIndex:1 animated:NO];

Agora você tem um lindo botão brilhante colorido com a cor de fundo especificada. Para ações, use o evento 'valor alterado'.

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


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


Por sugestão @EthanB e @karim fazendo um retângulo preenchido por trás, 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 cores, 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 destino para o UIButton para UIButton e altere a cor de segundo UIButton do UIButton . Em seguida, altere-o novamente no destino UIControlEventTouchUpInside ;


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 como 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 caixa de seleção 'User Interaction Enabled' no IB no UIView para permitir que os eventos de toque caiam em cascata no UIButton abaixo.

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

#import <QuartzCore/QuartzCore.h>

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






uibutton