2009-02-02 20 views

risposta

31

Come di iOS 5 questo molto più facile, utilizzando l'aspetto delega UIBarButtonItem:

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: 
         [UIColor blackColor], 
         UITextAttributeTextColor, 
         [UIColor clearColor], 
         UITextAttributeTextShadowColor, nil]; 

[[UIBarButtonItem appearance] setTitleTextAttributes: attributes 
              forState: UIControlStateNormal]; 

Impostalo nell'applicazione: didFinishLaunchingWithOptions:

+1

Questo potrebbe essere applicato anche ai singoli UIBarButtonItem. Per un pulsante reale della barra potresti scrivere: [button setTitleTextAttributes: textAttributes forState: UIControlStateNormal]; –

1

Non è possibile iterare il contenuto della vista UINavigationBar per trovare i pulsanti in awakeFromNib?

+0

È possibile. Ma sto facendo un setTextColor: forStates: sui miei pulsanti e sembra essere ignorato. Persevererà comunque. Anche questo confina con l'uso privato di API (o almeno la conoscenza assunta privata della struttura dell'interfaccia utente). – schwa

+0

Oh, lo riprendo, funziona. Vedi risposta successiva ... – schwa

+0

Ho sbirciato in altre viste come questa. Anche se è un po 'API-ish privato, almeno non fa supposizioni: se gli interni cambiano, il tuo codice non rileverà la condizione che stai cercando. Ma non ho ancora fatto UINavigationBar. –

8

Ecco un modo:

[[theNavigationBar.subviews objectAtIndex:1] setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; 
[[theNavigationBar.subviews objectAtIndex:2] setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; 

Tuttavia, enorme, avvertimento. È molto probabile che si interrompa in una versione futura del sistema operativo e non è consigliato.

Per lo meno è necessario eseguire molti test e accertarsi che le ipotesi del layout di sottomenu della barra di navigazione siano corrette.

+1

Lo troverei particolarmente fragile, dal momento che stai accedendo agli oggetti per indice. Più sicuro sarebbe quello di ottenere tutti gli articoli sottodistretto, confrontare le classi con ciò che ti aspetti e persino usare le posizioni. Ma questo è il nocciolo dell'idea proprio lì. :) –

+0

Giusto. Non ho postato il modo reale di farlo. Solo il primo metodo che ha funzionato. Programmazione difensiva ftw. – schwa

+0

Com'è buffo che non ottengo una risposta per quasi due mesi, e poi ne ottengo un intero raccolto ... comunque, ho contrassegnato questa risposta perché è la più scalabile, anche se quello che ho finito con l'abitudine immagini dei pulsanti. speriamo che qualcosa lo renda nell'API ufficiale dalla v3.0. – lawrence

2

O si utilizza la propria barra dei pulsanti voce sottoclasse con un setter specificato, lus non è iPhone OS 3 supponiamo per esporre colore del testo per ogni bottone

2

ho fatto come drunknbass suggerito. Ho fatto ricorso a una serie di immagini per il pulsante Indietro in alcuni stati, e pulsanti regolari in alcuni stati, e li ho inseriti in una sottoclasse UIButton personalizzata, impostando gli stili appropriati.

Come soluzione non si adatta particolarmente bene, ma i miei bisogni erano abbastanza semplici. Ha il vantaggio di non rompere se gli ordini subview nei controlli integrati cambiano però, che è l'ovvia svantaggio di tale approccio. Svantaggio di aver bisogno di più immagini. L'altra cosa difficile è gestire un cambiamento di orientamento, poiché i pulsanti dovrebbero cambiare dimensione.

In una nota correlata, se si modifica il colore della tinta della barra di navigazione, non funziona bene con il controller di visualizzazione "Altro" speciale per personalizzare l'ordine di una barra delle schede. Non sembra esserci alcun modo "accettabile" per cambiare il colore della barra degli strumenti in quella vista.

+0

Questa è una soluzione eccellente per una singola barra di navigazione. Ma come hai ammesso, non scala affatto bene. Probabilmente userei una soluzione come questa normalmente. Ma sto lavorando a un'app con requisiti di interfaccia utente molto dinamici. Potrei essere costretto a fare qualcosa di più hacky :-( – schwa

0

Ecco il modo pulito (basandosi su API pubblica) per fare questo IMHO: si consiglia di utilizzare la proprietà titleView del navigationItem per applicarlo proprio UILabel su cui si personalizzare l'textColor

 
 
UILabel* lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 20)]; 
lbl.textAlignment=UITextAlignmentCenter; 
lbl.backgroundColor=[UIColor clearColor]; 
lbl.textColor=[UIColor colorWithRed:0.18 green:0.2 blue:0.56 alpha:1]; 
theControllerOnWhichYouWantToHaveATitleWithYourOwnColor.navigationItem.titleView=lbl; 
[lbl release]; 
 

+0

Questo non influisce sul colore dei pulsanti sinistro e destro della voce di navigazione. – lawrence

+0

-1! :) Ok questo non risolve il pulsante Indietro, ad esempio, ma risolve il problema problema per la vista del titolo principale. Lo stesso approccio potrebbe essere applicato al pulsante Indietro su cui è possibile impostare anche una vista personalizzata. Quindi sono d'accordo che devi costruire la vista corretta con l'immagine di sfondo corretta e così via, ma questo è "fattibile" e con l'API pubblica. – yonel

+0

Ovviamente avrai downvoted se rispondi a una domanda diversa. La tua risposta sarebbe ok per questa domanda: http://stackoverflow.com/questions/599405/iphone-navigation-bar-title-text-color –

11
for (id subView in theNavigationBar.subviews) { 
    if ([subView isKindOfClass:[UIButton class]]) { 
     [(UIButton *)subView setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 
     [(UIButton *)subView setTitleShadowColor:[UIColor clearColor] forState:UIControlStateNormal]; 
    } 

} 
-1

è possibile modificare l'aspetto del titolo aggiungendo un'etichetta nella barra di navigazione come segue.

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 35)]; 
label.backgroundColor = [UIColor clearColor]; 
label.textAlignment = UITextAlignmentCenter; 
label.textColor =[UIColor whiteColor]; 
label.text=self.title; 
self.navigationItem.titleView = viewLabel; 
[label release]; 
Problemi correlati