iOS zmienia czcionkę i kolor tytułu paska nawigacji

102

Mam więc ten kod, który powinien zmienić czcionkę tytułu paska nawigacyjnego, ale działa

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

[[UINavigationBar appearance] setTitleTextAttributes:attributes];

Zmiana czcionki przycisku Wstecz za pomocą tego kodu działa dobrze.

   //set backbutton font
NSDictionary *normalAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                  [UIFont fontWithName:_dataManager.optionsSettings.fontString size:15], NSFontAttributeName,
                                  nil];
[[UIBarButtonItem appearance] setTitleTextAttributes:normalAttributes
                                            forState:UIControlStateNormal];
aZtraL-EnForceR
źródło

Odpowiedzi:

252

Prawidłowy sposób zmiany czcionki (i koloru) tytułu to:

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

Edycja: Swift 4.2

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

Edycja: 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)!]
Brian
źródło
3
Rozmiar pozostaje taki sam niezależnie od wartości, którą próbuję
Raphael Royer-Rivard,
1
Tak, zdałem sobie sprawę, że moja czcionka nie została poprawnie załadowana. Nadal nie mogę zrozumieć, dlaczego zaimportowałem OpenSans-Light i OpenSans-Regular w ten sam sposób, tylko OpenSans-Light wydaje się być użyteczny ...
Raphael Royer-Rivard
1
W kodzie Obj-C brakuje zamykającego nawiasu. Powinien to być: [self.navigationController.navigationBar setTitleTextAttributes: @ {NSForegroundColorAttributeName: [UIColor redColor], NSFontAttributeName: [UIFont fontWithName: @ "mplus-1c-regular" rozmiar: 21]}];
Dylan Hand
przejdź do linku do zmiany czcionki backBarButton: stackoverflow.com/a/16538596/5967144
soorej babu
A co w przypadku korzystania z paska nawigacyjnego LargeTitle? Nie znajduję navigationBar.LargeTitleTextAttributesnic ani nic w tym względzie. Czy wiesz, jak globalnie ustawić czcionkę LargeTitle?
iKK
54

Nie ma nic złego w innych odpowiedziach. Udostępniam tylko wersję storyboardu do ustawiania czcionki.

1. Wybierz pasek nawigacji w kontrolerze nawigacji

navbar

2. Zmień czcionkę tytułu w Inspektorze atrybutów

czcionka tytułu

(Prawdopodobnie będziesz musiał przełączyć Odcień paska dla paska nawigacji, zanim Xcode podniesie nową czcionkę)

Uwagi (zastrzeżenia)

Zweryfikowano, że to działa w Xcode 7.1.1+. ( Zobacz przykłady poniżej )

  1. Musisz przełączyć odcień paska nawigacyjnego, zanim czcionka zacznie obowiązywać (wydaje się, że jest to błąd w Xcode; możesz przełączyć go z powrotem na domyślny, a czcionka pozostanie)
  2. Jeśli wybierzesz czcionkę systemową ~ Upewnij się, że rozmiar nie jest równy 0,0 (w przeciwnym razie nowa czcionka zostanie zignorowana)

rozmiar

  1. Wygląda na to, że działa to bez problemu, gdy w hierarchii widoków znajduje się tylko jeden pasek nawigacyjny. Wygląda na to, że dodatkowe paski nawigacyjne w tym samym stosie są ignorowane. (Zwróć uwagę, że jeśli pokażesz navBar głównego kontrolera nawigacji, wszystkie inne niestandardowe ustawienia navBar są ignorowane).

Gotchas (deux)

Niektóre z nich są powtarzane, co oznacza, że ​​najprawdopodobniej warto na nie zwrócić uwagę.

  1. Czasami plik XML scenorysu ulega uszkodzeniu. Wymaga to przejrzenia struktury w trybie Storyboard jako kodu źródłowego (kliknij prawym przyciskiem myszy plik serii ujęć> Otwórz jako ...)
  2. W niektórych przypadkach tag navigationItem skojarzony z atrybutem środowiska wykonawczego zdefiniowanym przez użytkownika był ustawiany jako element potomny XML znacznika widoku zamiast znacznika kontrolera widoku. Jeśli tak, wyjmij go spomiędzy tagów, aby zapewnić prawidłowe działanie.
  3. Przełącz Odcień paska NavBar, aby upewnić się, że używana jest niestandardowa czcionka.
  4. Sprawdź parametr rozmiaru czcionki, chyba że używasz dynamicznego stylu czcionki
  5. Hierarchia widoku zastąpi ustawienia. Wydaje się, że jedna czcionka na stos jest możliwa.

Wynik

navbar-italic

Próbki

Obsługa czcionek niestandardowych

Uwaga ~ Ładna lista kontrolna znajduje się na stronie Code With Chris i możesz zobaczyć przykładowy projekt do pobrania.

Jeśli masz własną czcionkę i chcesz jej użyć w swojej serii ujęć, istnieje przyzwoity zestaw odpowiedzi na następujące pytanie SO . Jedna odpowiedź określa te kroki.

  1. Zdobądź niestandardowy plik czcionki (.ttf, .ttc)
  2. Zaimportuj pliki czcionek do projektu Xcode
  3. W app-info.plist dodaj klucz o nazwie Fonts dostarczony przez aplikację Jest to typ tablicy, dodaj wszystkie nazwy plików czcionek do tablicy, uwaga: łącznie z rozszerzeniem pliku.
  4. W serii ujęć na pasku nawigacyjnym przejdź do Inspektora atrybutów, kliknij prawym przyciskiem myszy w obszarze wyboru czcionki.W panelu podręcznym wybierz opcję Czcionka do niestandardowej i wybierz nazwę czcionki Family of you osadzonej.

Obejście niestandardowych czcionek

Wygląda więc na to, że Xcode może obsługiwać niestandardowe czcionki w UINavigationItem, ale ta funkcja po prostu nie aktualizuje się prawidłowo (wybrana czcionka jest ignorowana).

UINavigationItem

Aby obejść ten problem:

Jednym ze sposobów jest naprawienie korzystania ze scenorysu i dodania wiersza kodu: Najpierw dodaj UIView (UIButton, UILabel lub inną podklasę UIView) do kontrolera widoku (nie elementu nawigacji ... Xcode obecnie nie pozwala na to) że). Po dodaniu kontrolki możesz zmodyfikować czcionkę w serii ujęć i dodać odniesienie jako punkt wyjścia do kontrolera widoku. Po prostu przypisz ten widok do UINavigationItem.titleView. W razie potrzeby możesz również ustawić nazwę tekstu w kodzie. Zgłoszony błąd (23600285).

@IBOutlet var customFontTitleView: UIButton!

//Sometime later...    
self.navigationItem.titleView = customFontTitleView
Tommie C.
źródło
21

Spróbuj tego:

NSDictionary *textAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                [UIColor whiteColor],NSForegroundColorAttributeName,
                                [UIColor whiteColor],NSBackgroundColorAttributeName,nil];
self.navigationController.navigationBar.titleTextAttributes = textAttributes;
Akki
źródło
14

Mój kod Swift do zmiany tytułu paska nawigacji:

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

A jeśli chcesz również zmienić czcionkę tła, mam to w mojej AppDelegate:

let attributes = [NSFontAttributeName : UIFont(name: "Roboto-Medium", size: 16)!, NSForegroundColorAttributeName : UIColor.whiteColor()]
UIBarButtonItem.appearance().setTitleTextAttributes(attributes, forState: UIControlState.Normal)
Libor Zapletal
źródło
8

DODAJ ten jednoliniowy kod w swoim delegacie aplikacji - zakończono Lauch. Zmieni czcionkę, kolor paska nawigacji w całej aplikacji.

UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white, NSAttributedString.Key.font: UIFont(name: "YOUR FONT NAME", size: 25.0)!]
Renish Dadhaniya
źródło
5

Oto odpowiedź na Twoje pytanie:

Przenieś kod do poniższej metody, ponieważ tytuł paska nawigacji został zaktualizowany po załadowaniu widoku. Próbowałem dodać powyższy kod w viewDidLoad nie działa, działa dobrze w metodzie viewDidAppear.

  -(void)viewDidAppear:(BOOL)animated{}
Praveen Hiremath
źródło
3

Każdy potrzebuje wersji Swift 3. redColor()zmienił się na sprawiedliwy red.

self.navigationController?.navigationBar.titleTextAttributes =
        [NSForegroundColorAttributeName: UIColor.red,
         NSFontAttributeName: UIFont(name: "{your-font-name}", size: 21)!]
Karl Taylor
źródło
2

Jest trochę bardziej czytelny przy użyciu literałów:

self.navigationController.navigationBar.titleTextAttributes = @{
                                                              NSFontAttributeName:[UIFont fontWithName:@"mplus-1c-regular" size:21],
                                                              NSForegroundColorAttributeName: [UIColor whiteColor]
                                                              };
sPoz
źródło
2

Miałem jeden problem, ponieważ kiedy próbowałem programowo zmienić tytuł NavigationItem, nie byłem w stanie znaleźć mojej czcionki rodzinnej (próbowałem wielu rzeczy, ale nie można było go poprawnie uruchomić), więc znalazłem bardzo przyjemne i łatwe obejście w scenorysie.

  1. Najpierw dodajesz pod Elementem nawigacyjnym jeden widok pośrodku i nie zapomnij ustawić backGroundColor na wyczyszczenie koloru, aby mieć ten sam kolor navBar:

wprowadź opis obrazu tutaj

  1. Następnie dodajesz jedną etykietę, którą możesz edytować (ustawić kolor tekstu, czcionkę, rozmiar ...) w tym widoku
  2. Dodajesz ograniczenia do etykiety (góra = 0, dół = 0, koniec = 0 i interlinia = 0) do widoku i wyśrodkuj tekst etykiety

Na koniec powinieneś mieć coś takiego w konspekcie dokumentu:

wprowadź opis obrazu tutaj

I coś takiego w Twoim ViewController:

wprowadź opis obrazu tutaj

Mam nadzieję, że to pomoże.

O. Boujaouane
źródło
2

Szybki:-

self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white, NSAttributedStringKey.font: UIFont(name:"Love Nature", size: 40)!]
karthik
źródło
1

Ten jako alternatywa dla Swift 4 (już odpowiedź @Josh):

let titleTextAttributed: [NSAttributedStringKey: Any] = [.foregroundColor: UIColor.red, .font: UIFont(name: "AvenirNext-Regular", size: 20) as Any]
navigationController?.navigationBar.titleTextAttributes = titleTextAttributed
Hendra Kusumah
źródło
1

iOS 11

wprowadź opis obrazu tutaj

Cel 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
}
Vivek
źródło
1

Dla Objective-C, aby ustawić czcionkę i kolor

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

}
Hardik Thakkar
źródło
0

Oto odpowiedź na Swift 4 😁:

    let textAttributes:[String:Any]? = [NSAttributedStringKey.foregroundColor.rawValue:UIColor.blue, NSAttributedStringKey.font.rawValue:UIFont(name:"Avenir Next", size:20)!]
    navigationController?.navigationBar.titleTextAttributes = textAttributes
Josh
źródło
0

Nie zapomnij dodać wartości surowych kluczy, aby uniknąć błędów kompilacji.

    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
James Rochabrun
źródło
0

Swift 4.2

self.navigationController?.navigationBar.titleTextAttributes =
        [NSAttributedString.Key.foregroundColor: UIColor.white,
         NSAttributedString.Key.font: UIFont(name: "LemonMilklight", size: 21)!]
ilkayaktas
źródło
0

Dodaj to rozszerzenie

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

Dodaj następujący wiersz w viewDidLoad ()

self.navigationController?.navigationBar.changeFont()
Pranit
źródło
-1

Praca w swift 3.0 Aby zmienić kolor tytułu, musisz dodać atrybut titleTextAttributes w ten sposób

        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
vikram
źródło