3 votes

UIButton : définir l'image pour l'état normal, cacher cette image dans les autres états

[button setImage: [UIImage imageNamed:@"Back.png"] forState:UIControlStateNormal];
[button setTitle: @"Title" forState:UIControlStateSelected];

Je voudrais que le bouton affiche l'image en état normal mais le mot "Title" en état sélectionné. Mais je n'arrive pas à faire fonctionner ce code. Il affiche l'image lorsque je clique sur le bouton à l'état sélectionné et l'image couvre le titre. Je n'arrive pas à me débarrasser de l'image dans l'état sélectionné.

 [button setImage: [UIImage imageNamed:@"Back.png"] forState:UIControlStateNormal];
 [button setImage: [UIImage imageNamed:@"Back2.png"] forState:UIControlStateSelected];

Mais cela fonctionne. L'image passe de Back à Back2. Ou l'inverse fonctionne également

[button setImage: [UIImage imageNamed:@"Back.png"] forState:UIControlStateSelected];
[button setTitle: @"Title" forState:UIControlStateNormal];

C'est tellement simple que j'ai commencé à penser qu'il s'agissait d'un bug de l'UIButton.
Quelqu'un a-t-il déjà essayé ?

4voto

codeplasma Points 329

Ajoutez une petite image transparente (1px suffit) à votre projet et nommez-la, par exemple, transparent.png. Ajoutez ensuite cette ligne au code :

[button setImage: [UIImage imageNamed:@"transparent"] forState:UIControlStateSelected];

L'autre solution, beaucoup plus simple, consiste à utiliser le constructeur d'interface et à définir des images pour les différents états. Dans ce cas, il n'est même pas nécessaire d'utiliser l'image transparente ; il suffit de laisser le champ Image vide pour l'état Sélectionné.

enter image description here

3voto

Rivera Points 4219

Comme la réponse de @codeplasma, mais il n'est pas nécessaire d'ajouter une image transparente, il suffit de créer un fichier UIImage :

button.setImage(UIImage(), forState: .Selected)

En Objective-C, vous le créeriez avec [UIImage new] .

0voto

Roshan Points 835

Vous devez explicitement définir l'état du bouton comme étant sélectionné dans certains boutons UIButtons (comme le bouton rectangle arrondi), cela ne se fait pas automatiquement lorsque l'on clique dessus.

0voto

Daniel Points 14150

Bug ?

Non, ce n'est pas un bogue, l'UIButton est conçu de cette manière, et voici pourquoi : lorsque vous définissez une image pour le bouton UIButton 's UIControlStateNormal (état normal), il la conservera dans les autres états (sélectionné, désactivé, en surbrillance) au cas où vous n'auriez pas spécifié d'image pour ces autres états.

Cela signifie que vous pouvez configurer votre bouton avec une seule image, le système ajoute une surbrillance sombre dans l'état de surbrillance et donne au bouton l'apparence d'un alpha 0,5 dans l'état de désactivation.

On peut penser que le fait de fixer l'image à nil pour l'état sélectionné s'en débarrassera pour cet état, mais bien sûr quand l'état changera, il verra qu'il n'a pas d'image pour cet état (c'est nil !), mais il le fait pour l'État UIControlStateNormal Il utilisera donc cette dernière à la place, et vous vous retrouverez avec la même image !

Notez que si vous avez défini l'image pour un état différent de l'état normal, elle n'aurait été affichée que pour cet état.

Solution de contournement

Honnêtement, vos intentions concernant l'image et le titre du bouton semblent un peu bizarres... Peut-être que vous êtes nouveau sur iOS, peut-être qu'avec plus d'informations sur ce que votre bouton fait et est supposé faire, nous pourrions suggérer une meilleure solution.... mais la façon la plus simple de contourner ce problème avec les informations que vous nous avez données est de donner une image valide pour l'état sélectionné, une image qui est de préférence transparente, et qui pourrait être de 1x1 pixel pour économiser de l'espace.

Sinon, vous pouvez faire ceci, créer un UIImage au moment de l'exécution pour l'utiliser en tant que placeholder faisant office d'image, mais serait une bonne idée de le mettre en cache, peut-être de le créer une fois et de le conserver dans un iVar .

// Create a 1x1 UIImage at runtime
UIGraphicsBeginImageContext((CGSize){1.0f,1.0f});
UIImage *runtimeImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

// Setup your button 
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(20.0, 20.0, 100.0, 100.0);

// set the image for each state
[btn setImage:[UIImage imageNamed:@"Back.png"] forState:UIControlStateNormal];
[btn setImage:runtimeImage forState:UIControlStateSelected];

// have your text for the normal state
[btn setTitle:@"selected !" forState:UIControlStateNormal];

0voto

Jamil Points 18

Au lieu d'utiliser setImage, je suggère d'utiliser SetBackgroundImage pour ce scénario. Voici une solution similaire qui fonctionne pour moi :

UIImage *cardBackImage = [UIImage imageNamed:@"card.png"];
UIImage *cardFrontImage = [UIImage imageNamed:@"transparent.png"];

[cardButton setBackgroundImage:cardFrontImage forState:UIControlStateSelected];
[cardButton setBackgroundImage:cardFrontImage forState:UIControlStateSelected|UIControlStateDisabled];

[cardButton setBackgroundImage:cardBackImage forState:UIControlStateNormal];

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