107 votes

Est-il possible de changer la couleur d'arrière-plan d'un UIButton?

Celui-ci me laisse perplexe.

Est-il possible de changer la couleur de fond d'un UIButton en Cocoa pour iPhone ? J'ai essayé de définir la couleur de fond mais cela ne change que les coins. setBackgroundColor: semble être la seule méthode disponible pour ce genre de choses.

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

0 votes

Pouvez-vous réparer l'image, ou la supprimer? kthx ;)

0 votes

O-0 hmmmm....., l'image était correcte mais maintenant elle ne s'affiche plus. Je viens de la supprimer

0 votes

Il s'agit d'un duplicata de stackoverflow.com/questions/372731/…

161voto

Stian Storrvik Points 1834

Cela peut être fait de manière programmable en créant une réplique :

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;

edit : bien sûr, vous devriez #import

edit : à tous les nouveaux lecteurs, vous devriez également envisager quelques options ajoutées comme étant "une autre possibilité". pour votre considération.

Comme il s'agit d'une ancienne réponse, je recommande vivement de lire les commentaires pour le dépannage

0 votes

C'est ce que l'OP recherche.

4 votes

Doux! De toutes les solutions que j'ai trouvées, c'est celle que j'ai choisie. Pour clarification, faire une 'réplique' signifie utiliser Quartz pour dessiner un rectangle arrondi dans un bouton personnalisé, plutôt que d'utiliser un bouton de type RoundedRect. Au début, j'ai pensé que cela signifiait faire d'une manière ou d'une autre une copie d'un rectangle arrondi avec une couleur différente pour simuler le changement de couleur d'arrière-plan.

1 votes

A fonctionné parfaitement, meilleure réponse à l'OP. Merci de partager.

60voto

karim Points 4704

J'ai une approche différente,

[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'oubliez pas d'#import

2 votes

Bien joué. J'ai trouvé que je devais ajouter un btFind.layer.borderWidth = 1;

0 votes

J'aime cette solution, mais pour le moment je ne peux pas l'utiliser. Je reçois une erreur, car "CommonUIUtility" ne peut être trouvé. Google ne me donne que des éléments liés à Eclipse, mais je suppose que cela devrait être dans QuartzCore? Des idées?

0 votes

Non, c'est une classe définie par l'utilisateur pour effectuer des tâches d'interface utilisateur courantes dans l'application. Vous écrivez la méthode imageFromColor dans votre propre classe.

32voto

stigi Points 3189

Je suppose que vous parlez d'un UIButton avec UIButtonTypeRoundedRect? Vous ne pouvez pas changer la couleur de fond de celui-ci. Lorsque vous essayez de changer sa couleur de fond, vous changez plutôt la couleur du rectangle sur lequel le bouton est dessiné (qui est généralement transparent). Il y a donc deux façons de procéder. Soit vous sous-classez UIButton et écrivez sa méthode -drawRect:, soit vous créez des images pour les différents états du bouton (ce qui est tout à fait acceptable à faire).

Si vous définissez les images de fond dans Interface Builder, vous devriez remarquer que IB ne prend pas en charge le paramétrage des images pour tous les états que le bouton peut avoir. Je recommande donc de définir les images dans le code comme ceci:

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

La dernière ligne montre comment définir une image pour l'état sélectionné et en surbrillance (que IB ne peut pas définir). Vous n'avez pas besoin des images sélectionnées (ligne 4 et 6) si votre bouton n'a pas besoin d'un état sélectionné.

0 votes

Merci pour l'explication. Juste une question rapide. Si je suis en train de remplacer la méthode drawrect, je suppose que cela impliquerait d'utiliser une bibliothèque de dessin? Quelque chose le long des lignes de dessiner un rectangle arrondi programmatiquement et le remplir avec une couleur?

2 votes

Je viens de faire une courte recherche sur Google pour "iphone drawrect round corners" et j'ai trouvé ceci : iphonedevelopment.blogspot.com/2008/11/… Consultez la méthode drawrect pour un exemple de dessin d'un rectangle arrondi. Vous pouvez utiliser CGContextSetFillColorWithColor et CGContextFillPath pour remplir le chemin dessiné par CGContextAddArcToPoint.

2 votes

+50 pour avoir souligné le potentiel de masquage de bits pour les états de contrôle, c'est-à-dire : forState:(UIControlStateHighlighted | UIControlStateSelected) Cheers.

29voto

wubbe Points 321

Une autre possibilité:

  1. Créez un UIButton dans l'Interface Builder.
  2. Donnez-lui un type 'Custom'
  3. Maintenant, dans IB, il est possible de changer la couleur de fond

Cependant, le bouton est carré, et ce n'est pas ce que nous voulons. Créez un IBOutlet avec une référence à ce bouton et ajoutez ce qui suit à la méthode viewDidLoad:

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

N'oubliez pas d'importer QuartzCore.h

7 votes

Parfait, merci! Je ne suis pas sûr si c'est à cause de la version iOS que j'utilise (5.1) mais setClipToBounds n'était pas disponible. Au lieu de cela, j'ai utilisé buttonOutlet.layer.masksToBounds = TRUE;

0 votes

Lorsque j'ajoute ce code, il affiche un rectangle arrondi, mais lorsque je clique dessus, le bouton ne s'illumine pas en sens inverse. Que se passe-t-il ?

0 votes

Le problème avec cette approche est que vous ne pouvez pas définir une couleur de fond pour l'état surligné du bouton.

17voto

Mugunth Points 8671

Sous-classe UIButton et remplacer les méthodes setHighlighted et 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];
}

Ma méthode darkerShade est dans une catégorie UIColor comme ceci

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X