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.


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

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


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

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

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

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

7

En un rien de temps, vous pouvez faire:

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

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


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)

@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.


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.


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


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

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
            }
        }
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.