2013-04-12 11 views
28

Ho una UIButton personalizzata che è un file .png cloud, bianco e nero trasparente, senza stato negativo, solo un'immagine. Toccando e tenendo premuto il dito su di esso, diventa grigio scuro. Sto cercando di trasformare quel grigio scuro in qualcosa di un po 'meno opprimente. Il pulsante è all'esterno in una vista, non in una barra delle schede, barra degli strumenti o controller di navigazione.Modificare il colore dell'evidenziazione grigio scuro quando si tiene premuto UIButton personalizzato?

Ho già provato a impostare tintColor (che la documentazione mi informa utilmente è adatto solo per "alcuni" tipi di pulsanti, che nessuna indicazione su quale).

Ho anche provato a modificare tutto ciò che riesco a trovare in Interface Builder in relazione ai colori di evidenziazione, agli stati predefiniti, ecc. Nulla ha fatto la differenza.

Ho persino provato a impostare l'immagine del pulsante per il suo stato UIControlStateHighlighted, ma anche questo fa apparire la sovrapposizione di grigio scuro quando tengo il dito su di esso.

Come posso cambiare quel colore? Ho esaminato numerosi altri problemi qui su SO e non sono stato in grado di trovare una soluzione che funzioni per me. Qualsiasi aiuto sarebbe molto apprezzato!

EDIT: ho risolto il problema utilizzando una categoria di UIImage che aggiunge un metodo che utilizza CoreGraphics di applicare una tinta a una condizione UIImage. Quindi ho impostato QUESTA immagine come evidenziazione, e tutto va bene. Sembra un sacco di hoop-la per cambiare un colore Apple dovrebbe averci permesso di cambiare, ma c'est la vie.

risposta

55

Hai detto di impostare un'immagine personalizzata per lo stato UIControlStateHighlighted. Questo dovrebbe disabilitare il comportamento predefinito.

Se si verificano ancora problemi, è possibile disabilitare questo effetto impostando la proprietà adjustsImageWhenHighlighted su NO e utilizzare qualsiasi effetto personalizzato desiderato.

+0

Grazie. Accetterà tra 10 minuti quando me lo consente .. – Luke

+0

Ho appena fatto una modifica: l'impostazione di un'immagine personalizzata per "UIControlStateHighlighted" dovrebbe funzionare davvero. Vorrei provare di nuovo e assicurarmi di non aver sbagliato. –

+0

Penso che lo stia impostando ma non lo stendi correttamente, sto facendo alcune cose con il ridimensionamento dell'immagine basata sul testo al suo interno. Mostra il mezzo come bianco, ma il grigio scuro attorno agli esterni, quindi indovinare l'immagine non riempie lo spazio dell'originale. Il che è strano, dato che lo sto impostando su se stesso. – Luke

1

Stavo riscontrando un problema simile con un UIButton personalizzato quando il pulsante era evidenziato in grigio ogni volta che veniva premuto. Ho risolto il problema sottoclasse UIButton e nell'attuazione ho calpestato un unico metodo, (vuoto) setHighlighted: Metodo e tenute vuoto:

- (void)setHighlighted:(BOOL)highlighted 
{ 
    // Leave empty to prevent super from doing whatever 
    // that it is doing to show the grey highlight. 
} 

Tale fermato qualsiasi tipo di evidenziare come non facevo nulla nel metodo . È un approccio migliore se tutto ciò che stai tentando di fare è rimuovere qualsiasi effetto di evidenziazione.

Quindi, nel codice, creare una sottoclasse di UIButton, sovrascrivere il metodo setHighlighted e quindi rendere il pulsante personalizzato una sottoclasse di questa classe personalizzata.

+0

Forse il super sta anche facendo molto di più del semplice cambio di colore. Sarei cauto nel fare questo. – Yavin4

29

Se adjustImageWhenHighlighted = NO non funziona, imposta Button-Type su Custom (IB o programmaticamente).

Tipo di pulsante predefinito: Sistema, modifica il comportamento del pulsante evidenziato.

+0

Non so come mi sia mancato. Grazie. –

+0

Mi hai salvato la vita. Il tipo predefinito di Interface Builder per UIButton è 'system'. Davvero strano, eh? –

3

Swift 3:

myButton.adjustsImageWhenHighlighted = false 
0

È possibile scrivere un pulsante personalizzato che lo fa

class ActionButton: UIButton { 

    var originalBackgroundColor: UIColor! 

    override var backgroundColor: UIColor? { 
    didSet { 
     if originalBackgroundColor == nil { 
     originalBackgroundColor = backgroundColor 
     } 
    } 
    } 

    override var isHighlighted: Bool { 
    didSet { 
     guard let originalBackgroundColor = originalBackgroundColor else { 
     return 
     } 

     backgroundColor = isHighlighted ? originalBackgroundColor.darken() : originalBackgroundColor 
    } 
    } 
Problemi correlati