2011-11-25 3 views
16

dopo aver toccato il pulsante "record" BarButtonItem Vorrei mantenerlo evidenziato in modo programmatico fino al termine della registrazione. La grafica di evidenziazione di iOS è molto buona, quindi mi piacerebbe rimanere o impostare quello stato.evidenzia in modo programmatico UIBarButtonItem

Fino ad ora ho trovato "setSelected" e "setHighlighted", ma questi non funzionano su un UIBarButtonItem. Qualche suggerimento su come risolvere questo? Grazie in anticipo, Koen.

risposta

9

setSelected e setHighlighted funzionano bene su UIControls, ma non su UIBarButtonItems (che non sono UIControls).

Si consiglia di utilizzare il metodo - (void)setBackgroundImage:(UIImage *)backgroundImage forState:(UIControlState)state barMetrics:(UIBarMetrics)barMetrics (documentazione collegata) di UIBarButtonItem per modificare l'immagine di sfondo in modo da simulare l'evidenziazione.

È inoltre possibile impostare un UIView personalizzato sull'elemento che imita anche l'evidenziazione (vedere la proprietà).

+0

Ciao Michael, hai qualche codice di esempio sull'utilizzo di un customView in UIBarButtonItem? Ho provato a implementarlo ma ho finito con un rettangolo nero in cui lo volevo trasparente. Eventuali suggerimenti? – Ckoeny

+1

Ho risolto il problema utilizzando UIImageView come customView. impostare userInteractionEnabled su TRUE. – Ckoeny

-2

È possibile utilizzare due immagini per i due stati del pulsante come per uno stato "UIControlStateNormal" è possibile utilizzare un'immagine per la condizione normale.

E quindi quando si preme il pulsante, impostare l'altra immagine che lo mostra premuto, quindi l'immagine con un controllo utilizzando è il metodo selezionato di UIButton.

Spero che questo abbia un senso per te.

+0

-1 la domanda conferma che il metodo isSelected è disponibile su UIButton, ma richiede specificamente l'equivalente su UIBarButtonItem. –

5

Se si vuole assolutamente usare la grafica di default, è possibile inizializzare il vostro articolo pulsante come

UIBarButtonItem *toggleButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"MyButton" 
                    style:UIBarButtonItemStyleBordered 
                    target:someObject 
                    action:@selector(doSomething:)]; 

e alternare con

toggleButtonItem.style = (toggleButtonItem.style == UIBarButtonItemStyleBordered) 
         ? UIBarButtonItemStyleDone : UIBarButtonItemStyleBordered; 

Si sarebbe anche bisogno di utilizzare la proprietà di stile a leggere lo stato attuale.

BOOL isSelected = (toggleButtonItem.style == UIBarButtonItemStyleDone) 
3

Si crea una presa di questo pulsante per esempio btnMoreOut e lo fai:

btnMoreOut.tintColor = [UIColor colorWithRed:0.882 green:0.722 blue:0.169 alpha:1]; 

Spero che questo helps..Good fortuna :)

+0

Brillante. Funziona perfettamente per la mia implementazione! :) –

+0

Funziona come una gemma! – Miki

5

se si aggiunge un UIBarButtonItem con un UIButton sostenendolo, puoi semplicemente chiedere il CustomView.

UIBarButtonItem with a backing UIButton

UIButton *button = (UIButton *)[self.barButtonItem customView]; 
[button setSelected:YES]; 
+0

Questa risposta funziona alla grande, l'unico problema è che è necessario eseguire il cast [self.barButtonItem customView]; per l'UIButton. (UIButton *) self.barButtonItem.customView; Altrimenti funziona alla grande. –

+0

Sì, il cast è necessario, ma difficilmente serio. Hai votato questa risposta per quello? Basta modificarlo. –

+0

L'ho svalutato. Non sono sicuro da dove proveniva il downvote. –

2

1) Ottenere un riferimento al pulsante bar.

2) Utilizzando la proprietà style, assegnarlo a UIBarButtonItemStyleDone o UIBarButtonItemStylePlain sulla base di alcuni stati.

NB. Puoi ottenere lo stato in vari modi. Ad esempio, utilizzando NSUserDefaults, salvare una coppia di valori chiave lì. Estrarre il valore e acquisire alcune rappresentazioni BOOL da testare.Quindi scrivere questa linea:

self.myButton.style = self.someState ? UIBarButtonItemStyleDone : UIBarButtonItemStylePlain; 

O con i valori di default tutte annidati in questo modo:

self.myButton.style = [[NSUserDefaults standardUserDefaults] 
boolForKey:@"someKey"] ? UIBarButtonItemStyleDone : UIBarButtonItemStylePlain; 

senza che l'operatore ternario:

if ([[NSUserDefaults standardUserDefaults] 
    boolForKey:@"someKey"]) { 
self.myButton.style = UIBarButtonItemStyleDone; 
} else { 
self.myButton.style = UIBarButtonItemStylePlain; 
} 
+0

Mi sto stancando di chiedere alle persone di aggiungere spiegazioni e non esiste l'opzione "solo codice" mentre è presente l'opzione "solo collegamento". Per favore aggiungi spiegazioni! – Mark

+0

@ Mark Ok, fammi sapere se questo è abbastanza contesto per te allora. Ha senso ora? Sto usando l'operatore ternario che potrebbe lanciarti. – smileBot

+1

Grazie @cocoanut, questo è molto meglio. – Mark

0

si può provare questo (Swift):

func setupInterface(){ 

    var myButton = UIBarButtonItem() 
    if (your_condition){ 
     myButton = UIBarButtonItem(image: UIImage(named: "img_selected"), style: .Plain, target: self, action: Selector("DoSomething:")) 
    } 
    else{ 
     myButton = UIBarButtonItem(image: UIImage(named: "img_unselected"), style: .Plain, target: self, action: Selector("DoSomething:")) 
    } 
    navigationItem.rightBarButtonItem = myButton 
    } 

Call setupInterface() in Vi ewDidLoad e un'altra funzione nel codice.

0

se si vuole cambiare solo attributi titolo (ad esempio, il colore del titolo), è possibile chiamare setTitleTextAttributes:forState:

Per me, funziona più stabile di setTintColor: (pause cambiando colore tinta durante lo svolgimento di animazione spinta segue).

0

p.a.'s answer, convertito per Xcode 9, Swift 4.
L'idea è che i punti salienti .done stile - o grassetto, a Swift 4 - il testo del pulsante.

inizializzare l'elemento pulsante in uno stato non evidenziati

let toggleButtonItem = UIBarButtonItem(title: "MyButton", 
             style: .plain, 
             target: self, 
             action: #selector(doSomething)) 

Toggle l'elemento pulsante a uno stato evidenziato utilizzando un ternario operatore, in questo modo:

toggleButtonItem.style = (toggleButtonItem.style == .plain) ? 
         toggleButtonItem.style = .done : toggleButtonItem.style = .plain 

Oppure, in alternativa, , imposta lo stato di evidenziazione con una regolare affermazione if/else in questo modo:

if toggleButtonItem.style == .plain { 
    toggleButtonItem.style = .done 
} 
else { 
    toggleButtonItem.style = .plain 
} 

E, per impostare un valore booleano per controllare se l'elemento pulsante è evidenziato:

var isHighlighted: Bool = (toggleButtonItem.style == .done) 

Note:

  • Lo stile bordered è stata sconsigliata a iOS 8, quindi ho usato .plain qui invece. Entrambi presentano il testo dell'articolo pulsante in uno stato non illuminato.
  • La funzione #selector deve essere un @IBAction o deve essere preceduta da @objc, per evitare problemi di "inferenza in Objective-C". Per esempio:

    @objc func doSomething() { ... } 
    

    o, se è stato collegato un'azione alla voce tasto:

    @IBAction func doSomething() { ... } 
    

    Entrambe queste dichiarazioni di funzioni dire al compilatore che stanno utilizzando la funzionalità di Objective-C-based . Questo è necessario perché #selector è una cosa Objective-C sotto il cofano, e in Swift 4 devi dichiararlo, piuttosto che lasciare il compilatore dedurre cosa sta succedendo come ha fatto in precedenza.