UIButton: définir l'image pour l'état sélectionné en surbrillance

158

J'ai défini une image pour les états du bouton Normal, Surligné et Sélectionné, mais lorsque le bouton est dans l'état sélectionné et que j'appuie / le met en surbrillance, je n'ai pas vu mon image en surbrillance mais juste une image grisée. Est-il possible de définir une image pour l'état en surbrillance lorsque le bouton est sélectionné?

mon code:

[button setImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateHighlighted];
[button setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateSelected];

quand je fais:

[button setSelected:YES];

et appuyez sur le bouton, l'image "pressé.png" ne sélectionne pas.

user478681
la source
+1 J'ai le même problème, j'espère qu'il y aura des réponses.
Nick Weaver
3
Brillant! Qui sait que vous pouvez définir des images pour des combinaisons! A fonctionné à merveille pour moi!
David H
1
Impressionnant!!! votre question elle-même est une réponse pour moi ... Cela a fonctionné !!!
Kiran S
1
Cela fonctionne pour moi avec juste UIControlStateHighlighted, mais j'appelle d' button.adjustsImageWhenHighlighted = NO;abord.
Graham Perks
Ce. Tellement mieux que la solution que j'avais auparavant.
Meshach

Réponses:

231

J'ai trouvé la solution: besoin d'ajouter une ligne d'addition

[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateSelected | UIControlStateHighlighted];
user478681
la source
5
Un moyen de le faire via le constructeur d'interface?
Stephen
6
@stephen: Définir la propriété "Background" (image) d'UIButton pour différentes conditions de la propriété "StateConfig" (Default / Highlighted / Selected / Disabled) fonctionne pour moi.
Ajeet
2
La solution d'Ajeet n'a pas fonctionné pour moi. J'aimerais aussi connaître un moyen de faire ça sur IB
Lucas
3
Comme vous ne pouvez pas définir cela dans IB, vous pouvez le mettre dans votre méthode viewDidLoad, et ce sera presque aussi bien, car vous pouvez ensuite changer l'image dans IB et ne pas avoir à vous soucier de toujours mettre à jour le code pour qu'il corresponde. [bouton setImage: [bouton imageForState: UIControlStateHighlighted] forState: UIControlStateSelected | UIControlStateHighlighted];
Dave Wood
4
Vous pouvez le faire dans IB. Voir les captures d'écran dans la réponse ci-dessous!
Ríomhaire
121

Vous pouvez le faire dans Interface Builder.

Sélectionnez le que UIButtonvous souhaitez définir, IBpuis accédez au attributes inspector.

Dans les captures d'écran, j'utilise un type de bouton personnalisé, mais cela n'a pas d' importance.

Personnalisée par défaut

entrez la description de l'image ici

entrez la description de l'image ici

Ríomhaire
la source
5
La coutume ou le système compte beaucoup. Jouez avec les deux et vous verrez.
Ben Sinclair le
9
Pas dans le contexte de la question.
Ríomhaire le
7
Cela ne répond pas à la question. Il dit que la combinaison de l'état en surbrillance + sélectionné
Rafael Nobre
+1 parce que j'ai totalement manqué ces menus déroulants (j'avais l'habitude de tout faire par programmation jusqu'à tout récemment ...)
Nicolas Miari
30

Swift 3

// Default state (previously `.Normal`)
button.setImage(UIImage(named: "image1"), for: [])

// Highlighted
button.setImage(UIImage(named: "image2"), for: .highlighted)

// Selected
button.setImage(UIImage(named: "image3"), for: .selected)

// Selected + Highlighted
button.setImage(UIImage(named: "image4"), for: [.selected, .highlighted])

Pour définir l'image de fond, nous pouvons utiliser setBackgroundImage(_:for:)

Swift 2.x

// Normal
button.setImage(UIImage(named: "image1"), forState: .Normal)

// Highlighted
button.setImage(UIImage(named: "image2"), forState: .Highlighted)

// Selected
button.setImage(UIImage(named: "image3"), forState: .Selected)

// Selected + Highlighted
button.setImage(UIImage(named: "image4"), forState: [.Selected, .Highlighted])
kvothe
la source
La version de tableau n'a pas fonctionné pour moi. (au moins pendant setImage)
huggie
1
iOS 10 atténuera vos images normales / sélectionnées, ce qui est agréable et joli. Si vous définissez une image sélectionnée et en surbrillance, elle ne s'assombrira pas automatiquement. Ce qui est décevant.
snakeoil
28

Je pense que la plupart des affiches ici manquent complètement le point. J'ai eu le même problème. La question d'origine portait sur l'état en surbrillance d'un bouton sélectionné (COMBINAISON DES DEUX ÉTATS) qui ne peut pas être défini dans IB et revient à l'état par défaut avec un assombrissement en cours. Seule solution de travail comme un message mentionné:

[button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateSelected | UIControlStateHighlighted];
alghanor
la source
Je sais mais je n'étais pas autorisé d'une manière ou d'une autre
alghanor
1
pour une raison quelconque, je reçois toujours le problème même si je le définis comme ci-dessus. La seule façon pour moi d'obtenir une image personnalisée pour mon état de contrôle est de définir UIControlStateHighlighted uniquement.
Julius
12

Si vous avez une bonne raison de le faire, cela fera l'affaire

ajoutez ces cibles:

[button addTarget:self action:@selector(buttonTouchDown:) forControlEvents:UIControlEventTouchDown];
[button addTarget:self action:@selector(buttonTouchUp:) forControlEvents:UIControlEventTouchUpInside];


-(void)buttonTouchDown:(id)sender{
    UIButton *button=(UIButton *)sender;
    if(button.selected){
        [button setImage:[UIImage imageNamed:@"pressed.png"] forState:UIControlStateNormal];
    }
}

-(void)buttonTouchUp:(id)sender{
    UIButton *button=(UIButton *)sender;
    [button setImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
}
Jorge
la source
Merci pour cela, mais en fait c'est trop compliqué) Je m'attends à ce que le bouton fonctionne comme décrit ci-dessus
user478681
7

Dans Swift 3.x, vous pouvez définir l'image en surbrillance lorsque le bouton est sélectionné de la manière suivante:

// Normal state
button.setImage(UIImage(named: "normalImage"), for: .normal) 

// Highlighted state (before button is selected)
button.setImage(UIImage(named: "pressedImage"), for: .highlighted)

// Selected state
button.setImage(UIImage(named: "selectedImage"), for:  .selected)

// Highlighted state (after button is selected)
button.setImage(UIImage(named: "pressedAfterBeingSelectedImage"), 
                for:  UIControlState.selected.union(.highlighted))
Ashish Verma
la source
7

En un rien de temps, vous pouvez faire:

button.setImage(UIImage(named: "selected"), 
                forState: UIControlState.selected.union(.highlighted))
Roland Keesom
la source
2

Corrigez-moi si je me trompe. En faisant

   [button setSelected:YES];

vous modifiez clairement l'état des boutons sélectionnés. Alors naturellement par le code que vous avez fourni l'image sera que pour l'état sélectionné dans votre cas coché.png

visakh7
la source
pas entièrement compris ce que vous entendez par «effacer le changement d'état…». c'est très simple: je règle les images pour les états décrits ci-dessus, j'ajoute une action-cible pour ce bouton et dans la méthode qui traite mon action (événement de contrôle UIControlEventTouchUpInside) je bascule l'état sélectionné pour le bouton [bouton setSelected: YES / NO]. Et lorsque le bouton est actuellement dans l'état sélectionné et que j'appuie sur / le met en surbrillance, je ne vois que l'image grisée, comme s'il n'y avait pas de configuration d'image pour cet état.
user478681
Je voulais dire clairement là. Désolé. Lorsque vous appuyez d'abord sur le bouton, vous définissez son état comme sélectionné, de sorte que l'image s'affiche. Donc, si vous souhaitez obtenir uniquement l'image en surbrillance, définissez son état comme surligné. Je ne suis pas sûr cependant si je vous
comprends
Lorsque j'appuie sur le bouton pour la première fois, je le déclare comme mis en surbrillance, puis lorsque je le relâche, l'état sera sélectionné (tel que je l'ai défini dans ma méthode d'action). Ensuite, je l'appuie à nouveau (bouton déjà dans l'état sélectionné) et l'état devrait être changé en surbrillance et je devrais voir l'image pressée.png mais je ne la vois pas dans ce cas.
user478681
1

Si quelqu'un se demande comment cela fonctionne dans Swift, voici ma solution:

button.setImage("normal.png", forState: .Normal)
button.setImage("highlighted.png", forState: .Highlighted)
button.setImage("selected.png", forState: .Selected)

var selectedHighLightedStates: UIControlState = UIControlState.Highlighted
selectedHighLightedStates = selectedHighLightedStates.union(UIControlState.Selected)
button.setImage("selectedHighlighted.png", forState: selectedHighLightedStates)
basé sur Dieu
la source
@basegod c'est une solution qui fonctionne, mais la façon dont Roland Keesom l'a écrite est beaucoup plus propre.
jungledev
1

Swift 3+

button.setImage(UIImage(named: "selected_image"), for: [.selected, .highlighted])

OU

button.setImage(UIImage(named: "selected_image"), for: UIControlState.selected.union(.highlighted))

Cela signifie que le bouton en cours dans l' selectedétat, alors vous le touchez, affichez l' highlightétat.

yuanjilee
la source
0

J'ai eu un problème de réglage imageView.highlighted = NO; (le réglage OUI a fonctionné correctement et l'image a changé pour celle en surbrillance).

La solution appelait [imageView setHighlighted:NO];

Tout a fonctionné correctement.

DrArt
la source
0

D'où vous souhaitez appeler

[button addTarget:self action:@selector(test:) forControlEvents:UIControlEventTouchUpInside];

La méthode:

-(void)test:(id)sender{
    UIButton *button=(UIButton *)sender;
    if (_togon){
      [button setTitleColor:UIColorFromRGB(89,89, 89) forState:UIControlStateNormal];
      _togon=NO;
    }
    else{
      [button setTitleColor:UIColorFromRGB(28, 154, 214) forState:UIControlStateNormal];
      _togon=YES;
    }
}

Crédit ci-dessus à Jorge mais je l'ai amélioré un peu en donnant la solution de travail complète

Kingsley Mitchell
la source
0

Xamarin C #

Faire du OU au niveau du bit ne fonctionne pas pour une raison quelconque

button.SetImage(new UIImage("ImageNormal"), UIControlState.Normal);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Selected | UIControlState.Highlighted | UIControlState.Focused);

Les oeuvres suivantes

button.SetImage(new UIImage("ImageNormal"), UIControlState.Normal);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Selected);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Highlighted);
button.SetImage(new UIImage("ImagePressed"), UIControlState.Focused);
Pierre
la source
0

Si vous avez besoin de la teinte en surbrillance que le système d'exploitation fournit par défaut lorsque vous appuyez et maintenez sur un bouton personnalisé pour l'état sélectionné également, utilisez cette sous-classe UIButton. Écrit dans Swift 5:

import Foundation
import UIKit
class HighlightOnSelectCustomButton: UIButton {
    override var isHighlighted: Bool {
        didSet {
            if (self.isSelected != isHighlighted) {
                self.isHighlighted = self.isSelected
            }
        }
    }
}
Raj Pawan Gumdal
la source