Tasto UIB: imposta l'immagine per lo stato selezionato evidenziato


158

Ho impostato un'immagine per gli stati dei pulsanti Normale, Evidenziato e Selezionato, ma quando il pulsante nello stato selezionato e lo premo / evidenzio non ho visto l'immagine evidenziata ma solo l'immagine in grigio. È possibile impostare un'immagine per lo stato evidenziato quando il pulsante è selezionato?

il mio codice:

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

quando io faccio:

[button setSelected:YES];

e premi il pulsante, l'immagine "premuto.png" non seleziona.


+1 Ho lo stesso problema, spero che ci siano risposte.
Nick Weaver

3
Brillante! Chi mai saprebbe che potresti impostare immagini per combinazioni! Ha funzionato benissimo per me!
David H,

1
Eccezionale!!! la tua stessa domanda è una risposta per me ... Ha funzionato !!!
Kiran S

1
Funziona per me solo con UIControlStateHighlighted, ma io chiamo button.adjustsImageWhenHighlighted = NO;prima.
Graham Perks,

Questo. Molto meglio della soluzione che avevo prima.
Meshach,

Risposte:


231

Ho trovato la soluzione: è necessario aggiungere una linea di addizione

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

5
Un modo per farlo tramite l'interfaccia builder?
Stephen,

6
@stephen: L'impostazione della proprietà "Background" (immagine) di UIButton per le diverse condizioni della proprietà "StateConfig" (Default / Evidenziato / Selezionato / Disabilitato) funziona per me.
Ajeet

2
La soluzione di Ajeet non ha funzionato per me. Mi piacerebbe anche sapere un modo per farlo su IB
Lucas il

3
Dal momento che non puoi impostarlo in IB, puoi metterlo nel tuo metodo viewDidLoad e sarà quasi altrettanto buono, dal momento che puoi quindi modificare l'immagine in IB e non devi preoccuparti di aggiornare sempre il codice per abbinarlo. [button setImage: [button imageForState: UIControlStateHighlighted] forState: UIControlStateSelected | UIControlStateHighlighted];
Dave Wood,

4
Si può fare questo in IB. Guarda gli screenshot nella risposta qui sotto!
Ríomhaire,

121

Puoi farlo in Interface Builder.

Seleziona quello UIButtonche desideri impostare, IBquindi vai a attributes inspector.

Nelle schermate, sto usando un tipo di pulsante personalizzato, ma non importa.

Default personalizzato

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


5
L'abitudine o il sistema in realtà conta molto. Gioca con entrambi e vedrai.
Ben Sinclair,

9
Non nel contesto della domanda.
Ríomhaire,

7
Questo non risponde alla domanda. Dice che la combinazione di evidenziato + stato selezionato
Rafael Nobre

+1 perché mi mancavano totalmente questi menu a discesa (ero solito fare tutto programmaticamente fino a poco tempo fa ...)
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])

Per impostare l'immagine di sfondo che possiamo usare 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 versione dell'array non ha funzionato per me. (almeno durante setImage)
huggie

1
iOS 10 oscurerà le tue immagini normali / selezionate, il che è bello e sembra bello. Se imposti un'immagine selezionata, evidenziata, quest'ultima non si oscurerà automaticamente. Che è un peccato.
snakeoil

28

Penso che la maggior parte dei poster qui manchi completamente il punto. Ho avuto lo stesso problema. La domanda originale riguardava lo stato Evidenziato di un pulsante Selezionato (COMBINARE ENTRAMBI GLI STATI) che non può essere impostato in IB e torna allo stato Default con un oscuramento in corso. Solo soluzione funzionante come menzionato in un solo post:

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

lo so ma in qualche modo non mi è stato permesso
alghanor

1
per qualche motivo continuo a riscontrare il problema anche se l'ho impostato come sopra. L'unico modo per ottenere un'immagine personalizzata per il mio stato di controllo è impostare solo UIControlStateHighlighted.
Giulio

12

Se hai una buona ragione per farlo, questo farà il trucco

aggiungi questi target:

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

Grazie per questo, ma in realtà è troppo complicato) Mi aspetto che il pulsante funzionerà come descritto sopra
user478681

7

In Swift 3.x, puoi impostare l'immagine evidenziata quando il pulsante è selezionato nel modo seguente:

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

In breve tempo puoi fare:

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

2

Correggimi se sbaglio. Facendo

   [button setSelected:YES];

stai chiaramente cambiando lo stato dei pulsanti come selezionato. Quindi naturalmente con il codice che hai fornito l'immagine sarà quella per lo stato selezionato nel tuo caso controllato.png


non capisco bene cosa intendi per "cancellare cambiando lo stato ...". questo è molto semplice: ho impostato le immagini per gli stati sopra descritti, aggiungo azione-obiettivo per questo pulsante e nel metodo che elabora la mia azione (evento di controllo UIControlEventTouchUpInside) Attivo / disattivo lo stato selezionato per il pulsante [set di pulsantiSelezionato: SÌ / NO]. E quando il pulsante è attualmente nello stato selezionato e lo premo / evidenzio, vedo solo l'immagine in grigio, come se non fosse stata impostata alcuna immagine per questo stato.
user478681

Intendevo chiaramente lì. Scusa per quello. Quando si preme prima il pulsante, si imposta il suo stato come selezionato, in modo che l'immagine venga visualizzata. Quindi se vuoi ottenere solo l'immagine evidenziata, fai il suo stato come evidenziato. Non sono sicuro però se ti sto prendendo correttamente
visakh7

Quando premo prima il pulsante lo dichiaro come evidenziato e poi quando lo rilascio lo stato verrà selezionato (come lo imposto nel mio metodo di azione). Poi lo premo di nuovo (pulsante già nello stato selezionato) e lo stato dovrebbe essere cambiato in evidenziato e dovrei vedere l'immagine pressata.png ma non la vedo in questo caso.
user478681

1

Se qualcuno si chiede come funzioni in Swift, ecco la mia soluzione:

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 questa è una soluzione funzionante, ma il modo in cui Roland Keesom l'ha scritta è molto più pulito.
jungledev,

1

Swift 3+

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

O

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

Significa che il pulsante corrente nello selectedstato, quindi lo tocchi, mostra lo highlightstato.


0

Ho avuto problemi di impostazione imageView.highlighted = NO; (l'impostazione SÌ ha funzionato correttamente e l'immagine è cambiata in quella evidenziata).

La soluzione stava chiamando [imageView setHighlighted:NO];

Tutto ha funzionato correttamente.


0

Da dove vuoi chiamare

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

Il metodo:

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

Ringrazio Jorge ma l'ho migliorato un po 'dando la soluzione completa


0

Xamarin C #

Fare OR bit per bit non funziona per qualche motivo

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

I seguenti lavori

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

Se hai bisogno della tinta evidenziata che il sistema operativo fornisce di default quando tocchi e tieni premuto un pulsante personalizzato anche per lo stato selezionato, usa questa sottoclasse UIButton. Scritto in Swift 5:

import Foundation
import UIKit
class HighlightOnSelectCustomButton: UIButton {
    override var isHighlighted: Bool {
        didSet {
            if (self.isSelected != isHighlighted) {
                self.isHighlighted = self.isSelected
            }
        }
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.