Zmień kolor przycisku Wstecz na pasku nawigacyjnym

194

Próbuję zmienić kolor przycisku Ustawienia na biały, ale nie mogę go zmienić.

Próbowałem obu tych:

navigationItem.leftBarButtonItem?.tintColor = UIColor.whiteColor()
navigationItem.backBarButtonItem?.tintColor = UIColor.whiteColor()

ale bez zmian, nadal wygląda to tak:

wprowadź opis zdjęcia tutaj

Jak sprawić, by ten przycisk był biały?

Brandon Evans
źródło

Odpowiedzi:

284

Możesz zmienić globalny kolor odcienia w swojej serii ujęć, klikając puste miejsce na planszy i wybierając na prawym pasku narzędzi „Pokaż inspektora plików”, a na dole paska narzędzi zobaczysz opcję „Globalny odcień”.

Opcja globalnego odcienia w serii ujęć

Etgar
źródło
7
woah .. Fajne znalezisko !. czy wiesz jak to zrobić programowo?
Paul Lehn
10
Świetne znalezisko, ale zmiana globalnego odcienia na biały (zgodnie z pierwotnym pytaniem) spowoduje również zmianę takich elementów, jak wskaźniki ujawnienia szczegółów widoku tabeli na biały, co sprawi, że będą niewidoczne w danej tabeli.
Mike Fischer
1
Dodając do problemów Mike'a: ta kontrolka sprawia, że ​​wszystkie przyciski tekstowe mają ten kolor, więc albo musisz ustawić je ręcznie na kolor (tj. Oczywiście nie ma domyślnych kolorów), albo po prostu użyć innej metody.
Sirens,
4
Chociaż jest to szybkie i łatwe rozwiązanie, prowadzi do innych problemów, jeśli kolor jest biały / pasuje do tła. Jeśli masz pola tekstowe, kursor staje się niezauważalny, co sprawia, że ​​wygląda na użytkownika, jakby nie był w stanie pisać na polu tekstowym, ponieważ kursor nie jest widoczny.
Jose Ramirez
5
@PaulLehn Aby zrobić to programowo, AppDelegate.swift > application(application:didFinishLaunchingWithOptions:)możesz napisać:self.window!.tintColor = .yourColor
mmika1000
206

Ten kod zmienia kolor strzałki

self.navigationController.navigationBar.tintColor = UIColor.whiteColor();

Jeśli to nie zadziała, użyj poniższego kodu:

self.navigationBar.barStyle = UIBarStyle.Black
self.navigationBar.tintColor = UIColor.whiteColor()

Swift 3 Notes

UIColor.whiteColor() i podobne zostały uproszczone do UIColor.white

Ponadto wiele wcześniej niejawnych opcji zostało zmienionych na jawne, więc możesz potrzebować:

self.navigationController?.navigationBar =
Chamath Jeevan
źródło
7
self.navigationController?.navigationBar.tintColor = UIColor.whiteColor()pracował dla mnie (Swift 2.2)
Mike Fischer
self.navigationBar.barStyle = UIBarStyle.Black self.navigationBar.tintColor = UIColor.whiteColor () pracował dla mnie (Swift 3)
Ajay.km
Czy możesz wyjaśnić, dlaczego korzystać z UIBarStyle.Black?
mmika1000,
Proszę zaktualizować: self.navigationController? .NavigationBar.tintColor =
mohonish
1
zmienia tylko strzałkę, tylny tekst wciąż pozostaje taki sam w Xcode 11
Jeff Ayan
93

Bardzo łatwy do skonfigurowania w serii ujęć:

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

AlessandroDP
źródło
Idealnie, dziękuję :)
Naresh Reddy M
56

Powinieneś użyć tego:

navigationController?.navigationBar.barTintColor = .purple
navigationController?.navigationBar.tintColor = .white
Tiep Vu Van
źródło
Dzięki temu przycisk stał się biały, ale kolor tła był znacznie jaśniejszy. Czy wiesz, jak ponownie nadać kolorowi tła paska pełny kolor?
Brandon Evans
To jest poprawna odpowiedź. Zmieni kolor paska na fioletowy, ustawiając barTintColor i przyciski tytułu / paska na białe.
zirinisp
36

Szybki

 override func viewDidLoad() {
     super.viewDidLoad()

 self.navigationController?.navigationBar.tintColor = UIColor.white
 }
Deepak Tagadiya
źródło
1
Użyj w swift 3.
Deepak Tagadiya,
powiedz mi także, której szybkiej wersji możesz użyć?
Deepak Tagadiya,
A która klasa / plik / vc zapisuje ten kod w projekcie?
Deepak Tagadiya,
Na początku funkcji setCloseButton (), która jest wywoływana w viewWillAppear.
Jayprakash Dubey,
napisz w pliku NextViewController.swift, napisz również w viewDidLoad ().
Deepak Tagadiya,
20

Możesz użyć takiego jak ten. Umieść to w środku AppDelegate.swift.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.

        UINavigationBar.appearance().translucent = false
        UINavigationBar.appearance().barTintColor = UIColor(rgba: "#2c8eb5")
        UINavigationBar.appearance().tintColor = UIColor.whiteColor()
        UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor()]

        return true
    }
Mohammad Nurdin
źródło
20

Szybki 4.2

Zmień kompletny motyw aplikacji

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        UINavigationBar.appearance().tintColor = .white

        return true
    }

Zmień konkretny kontroler

let navController = UINavigationController.init(rootViewController: yourViewController) 
navController.navigationBar.tintColor = .red

present(navController, animated: true, completion: nil)
AiOsN
źródło
zmienia kolor dla całej aplikacji. Co się stanie, jeśli będę musiał go zmienić dla konkretnego ekranu / konkretnego UINavigationController?
Vyachaslav Gerchicov
@VyachaslavGerchicov powyższa odpowiedź dotyczy pełnego motywu aplikacji, jeśli chcesz zmienić konkretny kontroler. Zrób coś takiego: pozwól navController = UINavigationController.init (rootViewController: yourViewController) navController.navigationBar.tintColor = .red
AiOsN
Jeśli korzystasz z iOS 13, nie używasz już didFinishLaunchingWithOptions, został on przeniesiony do SceneDelegate.
JBarros35,
15

W Swift3 , Aby ustawić przycisk Wstecz na red.

self.navigationController?.navigationBar.tintColor = UIColor.red
Vincent
źródło
spowoduje to ustawienie paska nawigacji, a nie przycisku paska
carlodonz
1
Tak, to było pytanie.
Vincent
„Zmień kolor przycisku Wstecz na pasku nawigacyjnym”
carlodonz
To była jedyna metoda, która działała dla mnie. Coś wydaje się teraz zepsute w implementacji Apple ...
Dave Y
13

W Swift 4 możesz rozwiązać ten problem, używając:

let navStyles = UINavigationBar.appearance()
// This will set the color of the text for the back buttons.
navStyles.tintColor = .white
// This will set the background color for navBar
navStyles.barTintColor = .black
Darrell Richards
źródło
8

Szybki 3

Najbardziej pozytywna odpowiedź nie jest poprawna dla Swift 3.

wprowadź opis zdjęcia tutaj

Prawidłowy kod do zmiany koloru to:

self.navigationController?.navigationBar.tintColor = UIColor.white

Jeśli chcesz zmienić kolor, zmień UIColor.white powyżej na żądany kolor

Elon R.
źródło
To była jedyna metoda, która działała dla mnie. Coś wydaje się teraz zepsute w implementacji Apple ...
Dave Y
7

Wszystkie odpowiedzi ustawione w UINavigationBar.appearance().tintColorkonflikcie z dokumentacją Apple w UIAppearance.h.

Uwaga dla iOS7: na iOS7 tintColorwłaściwość została przeniesiona do UIView, a teraz ma specjalne dziedziczone zachowanie opisane w UIView.h. To odziedziczone zachowanie może powodować konflikt z serwerem proxy wyglądu i dlatego tintColorjest teraz niedozwolone z serwerem proxy wyglądu.

W Xcode musisz kliknąć polecenie każdej właściwości, której chcesz używać z proxy wyglądu, aby sprawdzić plik nagłówka i upewnić się, że właściwość jest opatrzona adnotacją UI_APPEARANCE_SELECTOR .

Tak więc poprawnym sposobem pokolorowania paska nawigacyjnego na fioletowo oraz białego tytułu i przycisków w aplikacji za pośrednictwem wyglądu proxy jest:

UINavigationBar.appearance().isTranslucent = false
UINavigationBar.appearance().barTintColor = .purple
UINavigationBar.appearance().titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
UIBarButtonItem.appearance().tintColor = .white

Zauważ, że UIBarButtonItemnie jest to podklasa, UIViewale raczej NSObject. Więc jego tintColorwłaściwość nie jest dziedziczona tintColorodUIView .

Niestety UIBarButtonItem.tintColornie jest opatrzone adnotacjami UI_APPEARANCE_SELECTOR- ale wydaje mi się, że to błąd w dokumentacji. Odpowiedź firmy Apple Engineering na ten radar mówi, że jest obsługiwany.

Jamie McDaniel
źródło
UINavigationBar.appearance (). LargeTitleTextAttributes = [NSAttributString.Key.foregroundColor: UIColor.white] // również
Guilherme
6
self.navigationController?.navigationBar.tintColor = UIColor.redColor()

Ten fragment działa magicznie. Zamiast czerwonego koloru zmień go na dowolny.

Suresh Kumar Durairaj
źródło
6

Użyj tego kodu w AppDelegateklasie wewnątrz didFinishLaunchingWithOptions.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

UINavigationBar.appearance().tintColor = .white

}
M.Nadeeshan
źródło
4

Spróbujmy tego kodu:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.

    let navigationBarAppearace = UINavigationBar.appearance()
    navigationBarAppearace.tintColor = UIColor.whiteColor()  // Back buttons and such
    navigationBarAppearace.barTintColor = UIColor.purpleColor()  // Bar's background color
    navigationBarAppearace.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor()]  // Title's text color

    self.window?.backgroundColor = UIColor.whiteColor()
    return true
}
Mannam Brahmam
źródło
Dziękuję bardzo, proszę pana
Arpit B Parekh,
4

w szybkim użyciu 2.0

self.navigationController!.navigationBar.tintColor = UIColor.whiteColor();
Riccardo Caroli
źródło
4

Jeśli masz już przycisk Wstecz w kontrolerze widoku „Ustawienia” i chcesz zmienić kolor przycisku Wstecz w kontrolerze widoku „Informacje o płatności” na coś innego, możesz to zrobić w kontrolerze widoku „Ustawienia” przygotuj się na taki segregator :

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "YourPaymentInformationSegue"
    {
        //Make the back button for "Payment Information" gray:
        self.navigationItem.backBarButtonItem?.tintColor = UIColor.gray               
    }
}
Despotovic
źródło
3
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];

To działa dla mnie, iOS 9.0+

yuchen
źródło
2

Dodaj następujący kod do funkcji didFinishLaunchingWithOptions w AppDelegate.swift

var navigationBarAppearace = UINavigationBar.appearance()

navigationBarAppearace.tintColor = uicolorFromHex(0xffffff) // White color
navigationBarAppearace.barTintColor = uicolorFromHex(0x034517) // Green shade

// change navigation item title color
navigationBarAppearace.titleTextAttributes =[NSForegroundColorAttributeName:UIColor.whiteColor()]
Jayprakash Dubey
źródło
Ten kod powoduje następujący błąd: „Użycie nierozwiązanego identyfikatora„ uicolorFromHex ”” Czy ktoś może mi pomóc w rozwiązaniu tego problemu?
jonathan3087
prawdopodobnie rozszerzenie dla UIColor. Możesz przeszukiwać stos, jak utworzyć rozszerzenie.
KvdLingen,
2

W przypadku Swift 2.0, aby zmienić kolor odcienia paska nawigacyjnego , tekst tytułu i kolor odcienia przycisku Wstecz zmieniono za pomocą następującego polecenia w AppDelegate.swift

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

  // Override point for customization after application launch.


    //Navigation bar tint color change

    UINavigationBar.appearance().barTintColor = UIColor(red: 42/255.0, green: 140/255.0, blue: 166/255.0, alpha: 0.5)

    //Back button tint color change

    UINavigationBar.appearance().barStyle = UIBarStyle.Default
    UINavigationBar.appearance().tintColor =  UIColor(red: 204/255.0, green: 255/255.0, blue: 204/255.0, alpha: 1)

    //Navigation Menu font tint color change

    UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor(red: 204/255.0, green: 255/255.0, blue: 204/255.0, alpha: 1), NSFontAttributeName: UIFont(name: "OpenSans-Bold", size: 25)!]//UIColor(red: 42/255.0, green: 140/255.0, blue: 166/255.0, alpha: 1.0)

    UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent


    return true
}
tak
źródło
2

Nie jestem pewien, dlaczego nikt o tym nie wspominał ... ale robiłem dokładnie to, co robiłeś w moim viewDidLoad... i to nie działało. Potem umieściłem mój kod viewWillAppeari wszystko działało.

Powyższe rozwiązanie polega na zmianie pojedynczego elementu paska. Jeśli chcesz zmienić kolor każdego paska nawigacji w kodzie, postępuj zgodnie z tą odpowiedzią .

Zasadniczo przejście na samą klasę za pomocą appearance()przypomina globalną zmianę we wszystkich instancjach tego widoku w aplikacji. Więcej informacji tutaj

kochanie
źródło
1

Masz jeden wybór, aby ukryć przycisk Wstecz i zrobić to samemu. Następnie ustaw kolor.

Ja to zrobiłem:

self.navigationItem.setHidesBackButton(true, animated: true)
let backbtn = UIBarButtonItem(title: "Back", style:UIBarButtonItemStyle.Plain, target: self, action: "backTapped:")
self.navigationItem.leftBarButtonItem = backbtn
self.navigationItem.leftBarButtonItem?.tintColor = UIColor.grayColor()
Muhammad Ahmed Baig
źródło
1
Pytanie dotyczyło konkretnie stylizacji lewego elementu nawigacyjnego i jest to najbliższa bezpośrednia odpowiedź na pytanie.
rzemiosło
0

Zostanie to rozwiązane za pomocą tej linii w - (void) viewDidLoad:

self.navigationItem.backBarButtonItem.tintColor = UIColor.whiteColor;
Ertaky
źródło
(lldb) p self.navigationItem.backBarButtonItem (UIBarButtonItem *) $9 = nil (lldb)
dengApro
0

Powinieneś dodać ten wiersz

 self.navigationController?.navigationBar.topItem?.backBarButtonItem?.tintColor = .black
Monir Khlaf
źródło
0

Wolę niestandardowy NavigationController niż ustawianie globalnego interfejsu użytkownika lub wstawianie ViewController.

Oto moje rozwiązanie


class AppNavigationController : UINavigationController {

  override func viewDidLoad() {
    super.viewDidLoad()
    self.delegate = self
  }

  override func viewWillAppear(_ animated: Bool) {

  }

}
extension AppNavigationController : UINavigationControllerDelegate {

  func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
    let backButtonItem = UIBarButtonItem(
      title: "   ",
      style: UIBarButtonItem.Style.plain,
      target: nil,
      action: nil)
    backButtonItem.tintColor = UIColor.gray
    viewController.navigationItem.backBarButtonItem = backButtonItem
  }

  func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {

  }

}

Ponadto nie musisz zadzierać z interfejsem Apple Api, takim jak EKEventEditViewController , PickerViewController itd., Jeśli używasz ustawień globalnych, takich jakUIBarButtonItem.appearance().tintColor = .white

tylerlantern
źródło
0
    self.navigationController?.navigationBar.tintColor = UIColor.black // to change the all text color in navigation bar or navigation 
    self.navigationController?.navigationBar.barTintColor = UIColor.white // change the navigation background color
    self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.black] // To change only navigation bar title text color
Vaibhav Gaikwad
źródło