iOS cambia il carattere e il colore del titolo della barra di navigazione


101

Quindi ho questo codice che dovrebbe cambiare il carattere del titolo della barra di navigazione, ma doenst

    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont
                                                                       fontWithName:_dataManager.optionsSettings.fontString size:14], NSFontAttributeName,
                            [UIColor whiteColor], NSForegroundColorAttributeName, nil];

[[UINavigationBar appearance] setTitleTextAttributes:attributes];

La modifica del carattere del pulsante Indietro con questo codice funziona perfettamente.

   //set backbutton font
NSDictionary *normalAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                  [UIFont fontWithName:_dataManager.optionsSettings.fontString size:15], NSFontAttributeName,
                                  nil];
[[UIBarButtonItem appearance] setTitleTextAttributes:normalAttributes
                                            forState:UIControlStateNormal];

Risposte:


251

Il modo corretto per cambiare il carattere (e il colore) del titolo è:

[self.navigationController.navigationBar setTitleTextAttributes:
 @{NSForegroundColorAttributeName:[UIColor redColor],
NSFontAttributeName:[UIFont fontWithName:@"mplus-1c-regular" size:21]}];

Modifica: Swift 4.2

self.navigationController?.navigationBar.titleTextAttributes =
[NSAttributedString.Key.foregroundColor: UIColor.red,
 NSAttributedString.Key.font: UIFont(name: "mplus-1c-regular", size: 21)!]

Modifica: Swift 4

self.navigationController?.navigationBar.titleTextAttributes =
[NSAttributedStringKey.foregroundColor: UIColor.red,
 NSAttributedStringKey.font: UIFont(name: "mplus-1c-regular", size: 21)!]

Swift 3:

self.navigationController?.navigationBar.titleTextAttributes = 
[NSForegroundColorAttributeName: UIColor.redColor(),
 NSFontAttributeName: UIFont(name: "mplus-1c-regular", size: 21)!]

2
La dimensione rimane la stessa indipendentemente dal valore che provo
Raphael Royer-Rivard

1
Sì, mi sono reso conto che il mio carattere non è stato caricato correttamente. Ancora non riesco a capire perché, ho importato OpenSans-Light e OpenSans-Regular allo stesso modo, solo OpenSans-Light sembra essere utilizzabile ...
Raphael Royer-Rivard

1
Nel codice Obj-C manca una parentesi di chiusura. Dovrebbe essere: [self.navigationController.navigationBar setTitleTextAttributes: @ {NSForegroundColorAttributeName: [UIColor redColor], NSFontAttributeName: [UIFont fontWithName: @ "mplus-1c-regular" size: 21]}];
Dylan Hand

goto il link per cambiare backBarButton font: stackoverflow.com/a/16538596/5967144
soorej Babu

Cosa succede quando si utilizza una barra di navigazione LargeTitle? Non trovo niente navigationBar.LargeTitleTextAttributeso niente a questo riguardo. Sai come impostare globalmente il carattere LargeTitle?
iKK

54

Non c'è niente di sbagliato nelle altre risposte. Sto solo condividendo la versione dello storyboard per l'impostazione del carattere.

1. Seleziona la barra di navigazione nel controller di navigazione

barra di navigazione

2. Modificare il carattere del titolo nell'Ispettore Attributi

titolo-font

(Probabilmente dovrai attivare la tonalità della barra per la barra di navigazione prima che Xcode raccolga il nuovo carattere)

Note (avvertenze)

Verificato che questo funzioni su Xcode 7.1.1+. ( Vedi gli esempi sotto )

  1. È necessario attivare o disattivare la tinta della barra di navigazione prima che il carattere abbia effetto (sembra un bug in Xcode; puoi ripristinarlo al valore predefinito e il carattere si attaccherà)
  2. Se scegli un carattere di sistema ~ Assicurati che la dimensione non sia 0,0 (altrimenti il ​​nuovo carattere verrà ignorato)

taglia

  1. Sembra che questo funzioni senza problemi quando solo una NavBar è nella gerarchia di visualizzazione. Sembra che i NavBar secondari nello stesso stack vengano ignorati. (Nota che se mostri la navBar del controller di navigazione principale, tutte le altre impostazioni personalizzate della navBar vengono ignorate).

Gotchas (deux)

Alcuni di questi vengono ripetuti, il che significa che molto probabilmente vale la pena notare.

  1. A volte l'xml dello storyboard viene danneggiato. Ciò richiede di rivedere la struttura in modalità Storyboard come codice sorgente (fare clic con il pulsante destro del mouse sul file storyboard> Apri come ...)
  2. In alcuni casi il tag navigationItem associato all'attributo di runtime definito dall'utente è stato impostato come figlio xml del tag di visualizzazione invece del tag del controller di visualizzazione. In tal caso, rimuoverlo tra i tag per un corretto funzionamento.
  3. Attiva o disattiva la tonalità NavBar per assicurarti che venga utilizzato il carattere personalizzato.
  4. Verificare il parametro della dimensione del carattere a meno che non si utilizzi uno stile di carattere dinamico
  5. La gerarchia di visualizzazione sovrascriverà le impostazioni. Sembra che sia possibile un font per stack.

Risultato

navbar-italico

Campioni

Gestione dei caratteri personalizzati

Nota ~ Una bella lista di controllo può essere trovata dal sito web Code With Chris e puoi vedere il progetto di download di esempio.

Se hai il tuo font e vuoi usarlo nel tuo storyboard, allora c'è un discreto insieme di risposte alla seguente domanda SO . Una risposta identifica questi passaggi.

  1. Ottieni un file di font personalizzato (.ttf, .ttc)
  2. Importa i file dei caratteri nel tuo progetto Xcode
  3. In app-info.plist, aggiungi una chiave denominata Font forniti dall'applicazione. È un tipo di array, aggiungi tutti i nomi dei file dei tuoi font all'array, nota: inclusa l'estensione del file.
  4. Nello storyboard, sulla NavigationBar, vai all'Inspector degli attributi, fai clic sul pulsante dell'icona a destra dell'area di selezione dei caratteri Nel pannello popup, scegli Carattere su personalizzato e scegli la famiglia del nome del carattere incorporato.

Soluzione alternativa ai caratteri personalizzati

Quindi Xcode sembra naturalmente in grado di gestire i caratteri personalizzati su UINavigationItem ma quella funzione non si aggiorna correttamente (il carattere selezionato viene ignorato).

UINavigationItem

Per risolvere questo problema:

Un modo è risolvere utilizzando lo storyboard e aggiungendo una riga di codice: prima aggiungi un UIView (UIButton, UILabel o qualche altra sottoclasse UIView) al controller della vista (non l'elemento di navigazione ... Xcode non ne consente attualmente uno quello). Dopo aver aggiunto il controllo, puoi modificare il carattere nello storyboard e aggiungere un riferimento come presa al tuo controller di visualizzazione. Assegna semplicemente quella vista a UINavigationItem.titleView. Puoi anche impostare il nome del testo nel codice, se necessario. Bug segnalato (23600285).

@IBOutlet var customFontTitleView: UIButton!

//Sometime later...    
self.navigationItem.titleView = customFontTitleView

21

Prova questo:

NSDictionary *textAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor whiteColor],NSForegroundColorAttributeName,
                                [UIColor whiteColor],NSBackgroundColorAttributeName,nil];
self.navigationController.navigationBar.titleTextAttributes = textAttributes;

14

Il mio codice Swift per cambiare il titolo della barra di navigazione:

let attributes = [NSFontAttributeName : UIFont(name: "Roboto-Medium", size: 16)!, NSForegroundColorAttributeName : UIColor.whiteColor()]
self.navigationController.navigationBar.titleTextAttributes = attributes

E se vuoi cambiare anche il carattere di sfondo, ho questo nel mio AppDelegate:

let attributes = [NSFontAttributeName : UIFont(name: "Roboto-Medium", size: 16)!, NSForegroundColorAttributeName : UIColor.whiteColor()]
UIBarButtonItem.appearance().setTitleTextAttributes(attributes, forState: UIControlState.Normal)

8

AGGIUNGI questo codice a riga singola nella tua App Delegate - Did Finish Lauch. Cambierà il carattere, il colore della barra di navigazione in tutta l'applicazione.

UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white, NSAttributedString.Key.font: UIFont(name: "YOUR FONT NAME", size: 25.0)!]

5

Ecco una risposta alla tua domanda:

Sposta il codice nel metodo seguente perché il titolo della barra di navigazione viene aggiornato dopo il caricamento della visualizzazione. Ho provato ad aggiungere il codice sopra in viewDidLoad non funziona, funziona bene nel metodo viewDidAppear.

  -(void)viewDidAppear:(BOOL)animated{}

3

Chiunque ha bisogno di una versione di Swift 3. redColor()è cambiato in solo red.

self.navigationController?.navigationBar.titleTextAttributes =
        [NSForegroundColorAttributeName: UIColor.red,
         NSFontAttributeName: UIFont(name: "{your-font-name}", size: 21)!]

2

È un po 'più leggibile usando i letterali:

self.navigationController.navigationBar.titleTextAttributes = @{
                                                              NSFontAttributeName:[UIFont fontWithName:@"mplus-1c-regular" size:21],
                                                              NSForegroundColorAttributeName: [UIColor whiteColor]
                                                              };

2

Ho avuto un problema perché quando ho provato a cambiare il mio titolo NavigationItem a livello di programmazione non sono riuscito a trovare il font della mia famiglia (ho provato molte cose ma impossibile farlo funzionare correttamente), quindi ho trovato una soluzione molto bella e facile nello storyboard.

  1. Per prima cosa aggiungi in Elemento di navigazione una vista al centro e non dimenticare di impostare backGroundColor su colore chiaro per avere lo stesso colore di navBar:

inserisci qui la descrizione dell'immagine

  1. Quindi aggiungi un'etichetta che puoi modificare (imposta il colore del testo, il carattere, la dimensione ...) in questa vista
  2. Si aggiungono vincoli all'etichetta (Top = 0, Bottom = 0, Trailing = 0 e Leading = 0) per visualizzare e centrare il testo dell'etichetta

Infine dovresti avere qualcosa del genere nella struttura del documento:

inserisci qui la descrizione dell'immagine

E qualcosa del genere nel tuo ViewController:

inserisci qui la descrizione dell'immagine

Spero che possa aiutare.


2

Swift: -

self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white, NSAttributedStringKey.font: UIFont(name:"Love Nature", size: 40)!]

1

Questo per alternativa a Swift 4 (già risposta di @Josh):

let titleTextAttributed: [NSAttributedStringKey: Any] = [.foregroundColor: UIColor.red, .font: UIFont(name: "AvenirNext-Regular", size: 20) as Any]
navigationController?.navigationBar.titleTextAttributes = titleTextAttributed

1

iOS 11

inserisci qui la descrizione dell'immagine

Objective-C

if (@available(iOS 11.0, *)) {
    self.navigationController.navigationItem.largeTitleDisplayMode =  UINavigationItemLargeTitleDisplayModeAlways;
    self.navigationController.navigationBar.prefersLargeTitles = true;

// Change Color
    self.navigationController.navigationBar.largeTitleTextAttributes = @{NSForegroundColorAttributeName: [UIColor whiteColor]};

} else {
    // Fallback on earlier versions
}

1

Affinché Objective-C imposti Carattere e Colore

- (void)_setup {
    NSDictionary *barButtonTitleAttributes = @{
                                               NSForegroundColorAttributeName : [UIColor whiteColor],
                                               NSFontAttributeName :[UIFont fontWithName:@"Lato-Regular" size:15.0]
                                               };
    [self.navigationBar setTitleTextAttributes:barButtonTitleAttributes];

}

0

Ecco una risposta per Swift 4 😁:

    let textAttributes:[String:Any]? = [NSAttributedStringKey.foregroundColor.rawValue:UIColor.blue, NSAttributedStringKey.font.rawValue:UIFont(name:"Avenir Next", size:20)!]
    navigationController?.navigationBar.titleTextAttributes = textAttributes

0

Non dimenticare di aggiungere i valori Raw delle chiavi per evitare errori di compilazione.

    let textAttributes:[NSAttributedStringKey: Any] = [NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue):UIColor.blue, NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue):UIFont(name:"OpenSans", size: 17)!]
    navigationController?.navigationBar.titleTextAttributes = textAttributes

0

Swift 4.2

self.navigationController?.navigationBar.titleTextAttributes =
        [NSAttributedString.Key.foregroundColor: UIColor.white,
         NSAttributedString.Key.font: UIFont(name: "LemonMilklight", size: 21)!]

0

Aggiungi questa estensione

extension UINavigationBar {
    func changeFont() {
        self.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white, NSAttributedStringKey.font: UIFont(name:"Poppins-Medium", size: 17)!]
    }
}

Aggiungi la seguente riga in viewDidLoad ()

self.navigationController?.navigationBar.changeFont()

-1

Lavorare in swift 3.0 Per cambiare il colore del titolo è necessario aggiungere titleTextAttributes in questo modo

        let textAttributes = [NSForegroundColorAttributeName:UIColor.white]
        self.navigationController.navigationBar.titleTextAttributes = textAttributes

For changing navigationBar background color you can use this
        self.navigationController.navigationBar.barTintColor = UIColor.white

For changing navigationBar back title and back arrow color you can use this
       self.navigationController.navigationBar.tintColor = UIColor.white
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.