Modifica del colore della barra di navigazione in Swift


240

Sto usando una vista di selezione per consentire all'utente di scegliere il tema del colore per l'intera app.

Sto pensando di cambiare il colore della barra di navigazione, dello sfondo e possibilmente della barra delle schede (se possibile).

Ho cercato come farlo, ma non riesco a trovare esempi Swift. Qualcuno potrebbe darmi un esempio del codice che dovrei usare per cambiare il colore della barra di navigazione e il colore del testo della barra di navigazione?

La vista Picker è impostata, sto solo cercando il codice per cambiare i colori dell'interfaccia utente.

Risposte:


526

Barra di navigazione:

navigationController?.navigationBar.barTintColor = UIColor.green

Sostituisci greenColor con qualunque UIColor desideri, puoi anche usare un RGB se preferisci.

Testo della barra di navigazione:

navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.orange]

Sostituisci orangeColor con qualsiasi colore ti piaccia.

Barra delle schede:

tabBarController?.tabBar.barTintColor = UIColor.brown

Testo della barra delle schede:

tabBarController?.tabBar.tintColor = UIColor.yellow

Negli ultimi due, sostituisci brownColor e yellowColor con il colore che preferisci.


Molte grazie! Non ero lontano da quello che stavo provando, ma non avevo le cose nel giusto ordine.
user3746428

Non ne sono sicuro. Se stai usando un push segue invece di un modale, dovrebbe essere la stessa barra di navigazione, ma non ne sono completamente sicuro. Scusate.
trumpeter201

2
Dopo l'aggiornamento ai beta Xcode più recenti, l'impostazione del colore del testo del titolo non funziona più. titleTextAttributes non è disponibile in Swift. Qualche idea?
user3746428

1
Potresti aprire una nuova domanda e forse un link ad essa? La chat non è il posto migliore per qualcosa del genere.
trumpeter201

3
Ho scoperto che mi sta facendo usare NSForegroundColorAttributeName come nome dell'attributo, ma per il resto funziona alla grande.
Jake Hall

90

Ecco alcune personalizzazioni dell'aspetto molto basilari che puoi applicare a livello di app:

UINavigationBar.appearance().backgroundColor = UIColor.greenColor()
UIBarButtonItem.appearance().tintColor = UIColor.magentaColor()
//Since iOS 7.0 UITextAttributeTextColor was replaced by NSForegroundColorAttributeName
UINavigationBar.appearance().titleTextAttributes = [UITextAttributeTextColor: UIColor.blueColor()]
UITabBar.appearance().backgroundColor = UIColor.yellowColor();

Di più UIAppearance sull'API in Swift puoi leggere qui: https://developer.apple.com/documentation/uikit/uiappearance


Quindi, come dovrei usarlo per cambiare il colore della barra di navigazione per l'intera app? Al momento ho solo: self.navigationController.navigationBar.barTintColor = UIColor.newBlueColor () e ovviamente questo cambia solo il colore della barra di navigazione del controller di visualizzazione in cui si trova il codice. Come posso usarlo per cambiare tutte le barre di navigazione? Ho provato a usare: UINavigationBar.appearance (). BackgroundColor = UIColor.newBlueColor () ma non sembra fare nulla.
user3746428

4
Per riflettere i chnage nell'app entero, incollare il metodo sopra riportato sotto dell'applicazione AppDelegate.swift func (applicazione: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {// Place above code}
Badrinath

7
Usa barTintColor invece di backgroundColor. UINavigationBar.appearance (). BarTintColor = UIColor.greenColor ()
Michael Peterson

@Keenle Sono un po 'confuso ... Perché la modifica del colore di sfondo di UINavigationBar tramite l'API di aspetto non cambia completamente il suo colore? Ho provato a impostare il colore di sfondo sul blu e mi ha dato una strana tonalità di blu violaceo ...
fja

60

Aggiornato per Swift 3, 4, 4.2, 5+

// setup navBar.....
UINavigationBar.appearance().barTintColor = .black
UINavigationBar.appearance().tintColor = .white
UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
UINavigationBar.appearance().isTranslucent = false

Swift 4

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

Swift 4.2, 5+

UINavigationBar.appearance().barTintColor = .black
UINavigationBar.appearance().tintColor = .white
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
UINavigationBar.appearance().isTranslucent = false

Puoi anche controllare qui: https://github.com/hasnine/iOSUtilitiesSource


Swift 4.2: NSAttributedString.Key.foregroundColor
Kasra Babaei

l'impostazione del colore della tinta su bianco anziché su bartintcolor mostra il colore originale. Grande!
NickCoder il

@NickCoder lo apprezza. :) controlla anche la mia lib: github.com/hasnine/iOSUtilitiesSource
Jamil Hasnine Tamim

52
UINavigationBar.appearance().barTintColor = UIColor(red: 46.0/255.0, green: 14.0/255.0, blue: 74.0/255.0, alpha: 1.0)
UINavigationBar.appearance().tintColor = UIColor.whiteColor()
UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()]

Basta incollare questa riga didFinishLaunchingWithOptionsnel tuo codice.


Ho provato questo con RGB e non funziona, non importa dove l'ho messo.
Nathan McKaskle,

@NathanMcKaskle Controlla il tuo RGB, dovrebbe essere nel formato "xx / 250.0f".
Mohit Tomar,

Utilizzato in didFinishLaunchingWithOptions e ha funzionato perfettamente. Inside viewDidLoad non funziona perfettamente.
Touhid

26

All'interno di AppDelegate , questo ha cambiato globalmente il formato di NavBar e rimuove la linea di fondo / bordo (che è un'area problematica per la maggior parte delle persone) per darti quello che penso tu e gli altri stiate cercando:

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

    UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    UINavigationBar.appearance().shadowImage = UIImage()
    UINavigationBar.appearance().tintColor = UIColor.whiteColor()
    UINavigationBar.appearance().barTintColor = Style.SELECTED_COLOR
    UINavigationBar.appearance().translucent = false
    UINavigationBar.appearance().clipsToBounds = false
    UINavigationBar.appearance().backgroundColor = Style.SELECTED_COLOR
    UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : (UIFont(name: "FONT NAME", size: 18))!, NSForegroundColorAttributeName: UIColor.whiteColor()] }

Quindi è possibile impostare un file Constants.swift e contenuto è una struttura di stile con colori e caratteri ecc. È quindi possibile aggiungere un tableView / pickerView a qualsiasi ViewController e utilizzare l'array "availableThemes" per consentire all'utente di cambiare themeColor.

La cosa bella di questo è che puoi usare un riferimento in tutta la tua app per ogni colore e si aggiornerà in base al "Tema" selezionato dall'utente e senza uno di default è theme1 ():

import Foundation
import UIKit

struct Style {


static let availableThemes = ["Theme 1","Theme 2","Theme 3"]

static func loadTheme(){
    let defaults = NSUserDefaults.standardUserDefaults()
    if let name = defaults.stringForKey("Theme"){
        // Select the Theme
        if name == availableThemes[0]   { theme1()  }
        if name == availableThemes[1]   { theme2()  }
        if name == availableThemes[2]   { theme3()  }
    }else{
        defaults.setObject(availableThemes[0], forKey: "Theme")
        theme1()
    }
}

 // Colors specific to theme - can include multiple colours here for each one
static func theme1(){
   static var SELECTED_COLOR = UIColor(red:70/255, green: 38/255, blue: 92/255, alpha: 1) }

static func theme2(){
    static var SELECTED_COLOR = UIColor(red:255/255, green: 255/255, blue: 255/255, alpha: 1) }

static func theme3(){
    static var SELECTED_COLOR = UIColor(red:90/255, green: 50/255, blue: 120/255, alpha: 1) } ...

2
Grazie amico, la tua risposta mi ha davvero aiutato, almeno per me, ho usato la prima parte ed è stato fantastico e molto utile
Ameer Fares,

1
Grazie mille amico, ho provato tutte le risposte qui e nessuna di esse ha funzionato tranne la tua: D
Ronak Shah,

19

Per fare questo sullo storyboard (Interface Builder Inspector)

Con l'aiuto di IBDesignable, possiamo aggiungere più opzioni a Interface Builder Inspector per UINavigationControllere modificarle sullo storyboard. Innanzitutto, aggiungi il seguente codice al tuo progetto.

@IBDesignable extension UINavigationController {
    @IBInspectable var barTintColor: UIColor? {
        set {
            guard let uiColor = newValue else { return }
            navigationBar.barTintColor = uiColor
        }
        get {
            guard let color = navigationBar.barTintColor else { return nil }
            return color
        }
    }
}

Quindi imposta semplicemente gli attributi per il controller di navigazione sullo storyboard.

inserisci qui la descrizione dell'immagine

Questo approccio può essere utilizzato anche per gestire il colore del testo della barra di navigazione dallo storyboard:

@IBInspectable var barTextColor: UIColor? {
  set {
    guard let uiColor = newValue else {return}
    navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: uiColor]
  }
  get {
    guard let textAttributes = navigationBar.titleTextAttributes else { return nil }
    return textAttributes[NSAttributedStringKey.foregroundColor] as? UIColor
  }
}

18

Swift 4:

Codice perfettamente funzionante per modificare l'aspetto della barra di navigazione a livello di applicazione.

inserisci qui la descrizione dell'immagine

// MARK: Navigation Bar Customisation

// To change background colour.
UINavigationBar.appearance().barTintColor = .init(red: 23.0/255, green: 197.0/255, blue: 157.0/255, alpha: 1.0)

// To change colour of tappable items.
UINavigationBar.appearance().tintColor = .white

// To apply textAttributes to title i.e. colour, font etc.
UINavigationBar.appearance().titleTextAttributes = [.foregroundColor : UIColor.white,
                                                    .font : UIFont.init(name: "AvenirNext-DemiBold", size: 22.0)!]
// To control navigation bar's translucency.
UINavigationBar.appearance().isTranslucent = false

Buona programmazione!


16
UINavigationBar.appearance().barTintColor

ha funzionato per me


15

SWIFT 4 - Transizione graduale (migliore soluzione):

Se stai tornando indietro da un controller di navigazione e devi impostare un colore diverso sul controller di navigazione che hai premuto da utilizzare

override func willMove(toParentViewController parent: UIViewController?) {
    navigationController?.navigationBar.barTintColor = .white
    navigationController?.navigationBar.tintColor = Constants.AppColor
}

invece di metterlo in viewWillAppear in modo che la transizione sia più pulita.

SWIFT 4.2

override func willMove(toParent parent: UIViewController?) {
    navigationController?.navigationBar.barTintColor = UIColor.black
    navigationController?.navigationBar.tintColor = UIColor.black
}

11

In Swift 4

Puoi cambiare il colore della barra di navigazione. Usa questo frammento di codice qui sotto inviewDidLoad()

Colore barra di navigazione

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

Colore testo barra di navigazione

self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.purple]

Per iOS 11 Barra di navigazione per titoli di grandi dimensioni , è necessario utilizzare la largeTitleTextAttributesproprietà

self.navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.purple]

9

La appearance()funzione non sempre funziona per me. Quindi preferisco creare un oggetto NC e modificarne gli attributi.

var navBarColor = navigationController!.navigationBar
navBarColor.barTintColor =
    UIColor(red:  255/255.0, green: 0/255.0, blue: 0/255.0, alpha: 100.0/100.0)
navBarColor.titleTextAttributes =
    [NSForegroundColorAttributeName: UIColor.whiteColor()]

Anche se vuoi aggiungere un'immagine invece del solo testo, funziona anche

var imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 70, height: 70))
imageView.contentMode = .ScaleAspectFit

var image = UIImage(named: "logo")
imageView.image = image
navigationItem.titleView = imageView

in questo modo, sono stato in grado di cambiare il colore di self.navigationController? .navigationBar.topItem? .title. Grazie.
Oguzhan,

8

Usa l'API di aspetto e il colore barTintColor.

UINavigationBar.appearance().barTintColor = UIColor.greenColor()

4

iOS 8 (veloce)

let font: UIFont = UIFont(name: "fontName", size: 17)   
let color = UIColor.backColor()
self.navigationController?.navigationBar.topItem?.backBarButtonItem?.setTitleTextAttributes([NSFontAttributeName: font,NSForegroundColorAttributeName: color], forState: .Normal)

4

Se disponi di un controller di navigazione personalizzato, puoi utilizzare lo snippet di codice sopra riportato. Quindi nel mio caso, ho usato i seguenti pezzi di codice.

Swift 3.0, versione XCode 8.1

navigationController.navigationBar.barTintColor = UIColor.green

Testo della barra di navigazione:

navigationController.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.orange]

Sono discorsi molto utili.


4

Aggiornamento Swift 4, iOS 12 e Xcode 10

Basta inserire una riga all'interno viewDidLoad()

navigationController?.navigationBar.barTintColor = UIColor.red

3

In Swift 2

Per cambiare colore nella barra di navigazione,

navigationController?.navigationBar.barTintColor = UIColor.whiteColor()

Per cambiare il colore nella barra di navigazione dell'elemento,

navigationController?.navigationBar.tintColor = UIColor.blueColor()

o

navigationController!.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.blueColor()]

3

Swift 3

UINavigationBar.appearance().barTintColor = UIColor(colorLiteralRed: 51/255, green: 90/255, blue: 149/255, alpha: 1)

Questo imposterà il colore della barra di navigazione come il colore della barra di Facebook :)


3

Xcode compatibile Swift 3 e Swift 4 9

Una soluzione migliore per questo per creare una classe per le barre di navigazione comuni

Ho 5 controller e ogni titolo di controller viene cambiato in arancione. Poiché ogni controller ha 5 controller di navigazione, quindi ho dovuto cambiare ogni colore sia da ispettore o da codice.

Quindi ho creato una classe invece di cambiare ogni barra di navigazione dal codice che ho appena assegnato a questa classe e ha funzionato su tutte e 5 le capacità di riutilizzo del codice del controller. Devi solo assegnare questa classe a ciascun controller e questo è tutto.

import UIKit

   class NabigationBar: UINavigationBar {
      required init?(coder aDecoder: NSCoder) {
       super.init(coder: aDecoder)
    commonFeatures()
 }

   func commonFeatures() {

    self.backgroundColor = UIColor.white;
      UINavigationBar.appearance().titleTextAttributes =     [NSAttributedStringKey.foregroundColor:ColorConstants.orangeTextColor]

 }


  }

2

iOS 10 Swift 3.0

Se non ti dispiace usare i framework rapidi, allora noi UINeraida per cambiare lo sfondo di navigazione come UIColoro HexColoro UIImagee cambiare il testo del pulsante di navigazione indietro a livello di codice, cambia il colore completo del testo di primo piano.

Per UINavigationBar

    neraida.navigation.background.color.hexColor("54ad00", isTranslucent: false, viewController: self)
    
    //Change navigation title, backbutton colour
    
    neraida.navigation.foreground.color.uiColor(UIColor.white, viewController: self)
    
    //Change navigation back button title programmatically
    
    neraida.navigation.foreground.backButtonTitle("Custom Title", ViewController: self)
    
    //Apply Background Image to the UINavigationBar
    
    neraida.navigation.background.image("background", edge: (0,0,0,0), barMetrics: .default, isTranslucent: false, viewController: self)

2

Swift 3

Una fodera semplice in cui è possibile utilizzare ViewDidLoad()

//Change Color
    self.navigationController?.navigationBar.barTintColor = UIColor.red
//Change Text Color
    self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]

2

Questa versione rimuove anche la linea d'ombra 1px sotto la barra di navigazione:

Swift 5: inseriscilo nella AppDelegate didFinishLaunchingWithOptions

UINavigationBar.appearance().barTintColor = UIColor.black
UINavigationBar.appearance().tintColor = UIColor.white
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
UINavigationBar.appearance().isTranslucent = false
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .any, barMetrics: .default)
UINavigationBar.appearance().shadowImage = UIImage()

1

Ho dovuto fare

UINavigationBar.appearance().tintColor = UIColor.whiteColor()
UINavigationBar.appearance().barStyle = .Black
UINavigationBar.appearance().backgroundColor = UIColor.blueColor()

altrimenti il ​​colore di sfondo non cambierebbe


1

Innanzitutto imposta la proprietà isTranslucent di navigationBar su false per ottenere il colore desiderato. Quindi cambia il colore della barra di navigazione in questo modo:

@IBOutlet var NavigationBar: UINavigationBar!

NavigationBar.isTranslucent = false
NavigationBar.barTintColor = UIColor (red: 117/255, green: 23/255, blue: 49/255, alpha: 1.0)

1

Assicurarsi di impostare lo stato del pulsante su .normal

extension UINavigationBar {

    func makeContent(color: UIColor) {
        let attributes: [NSAttributedString.Key: Any]? = [.foregroundColor: color]

        self.titleTextAttributes = attributes
        self.topItem?.leftBarButtonItem?.setTitleTextAttributes(attributes, for: .normal)
        self.topItem?.rightBarButtonItem?.setTitleTextAttributes(attributes, for: .normal)
    }
}

PS iOS 12, Xcode 10.1


1
Grazie. Ho cercato per ore questa topItemsoluzione. È frustrante il numero di modifiche che Apple continua ad apportare al modo in cui gli stili vengono applicati alla navigazione.
App Dev Guy

1

basta chiamare questa estensione e passare il colore cambierà automaticamente il colore della barra di navigazione

extension UINavigationController {

     func setNavigationBarColor(color : UIColor){
            self.navigationBar.barTintColor = color
        }
    }

nella vista didload o in viewwill appare call

self.navigationController? .setNavigationBarColor (color: <# T ## UIColor #>)


1

Prova questo in AppDelegate:

//MARK:- ~~~~~~~~~~setupApplicationUIAppearance Method
func setupApplicationUIAppearance() {

    UIApplication.shared.statusBarView?.backgroundColor = UIColor.clear

    var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }

    UINavigationBar.appearance().tintColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
    UINavigationBar.appearance().barTintColor =  UIColor.white
    UINavigationBar.appearance().isTranslucent = false

    let attributes: [NSAttributedString.Key: AnyObject]

    if DeviceType.IS_IPAD{
        attributes = [
            NSAttributedString.Key.foregroundColor: UIColor.white,
            NSAttributedString.Key.font: UIFont(name: "HelveticaNeue", size: 30)
            ] as [NSAttributedString.Key : AnyObject]
    }else{
        attributes = [
            NSAttributedString.Key.foregroundColor: UIColor.white
        ]
    }
    UINavigationBar.appearance().titleTextAttributes = attributes
}

iOS 13

func setupNavigationBar() {
    //        if #available(iOS 13, *) {
    //            let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
    //            let statusBar = UIView(frame: window?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero)
    //            statusBar.backgroundColor = #colorLiteral(red: 0.2784313725, green: 0.4549019608, blue: 0.5921568627, alpha: 1) //UIColor.init(hexString: "#002856")
    //            //statusBar.tintColor = UIColor.init(hexString: "#002856")
    //            window?.addSubview(statusBar)
    //            UINavigationBar.appearance().tintColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
    //            UINavigationBar.appearance().barTintColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
    //            UINavigationBar.appearance().isTranslucent = false
    //            UINavigationBar.appearance().backgroundColor = #colorLiteral(red: 0.2784313725, green: 0.4549019608, blue: 0.5921568627, alpha: 1)
    //            UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]
    //        }
    //        else
    //        {
    UIApplication.shared.statusBarView?.backgroundColor = #colorLiteral(red: 0.2784313725, green: 0.4549019608, blue: 0.5921568627, alpha: 1)
    UINavigationBar.appearance().tintColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
    UINavigationBar.appearance().barTintColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
    UINavigationBar.appearance().isTranslucent = false
    UINavigationBar.appearance().backgroundColor = #colorLiteral(red: 0.2784313725, green: 0.4549019608, blue: 0.5921568627, alpha: 1)
    UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]
    //        }
}

estensioni

extension UIApplication {

var statusBarView: UIView? {
    if responds(to: Selector(("statusBar"))) {
        return value(forKey: "statusBar") as? UIView
    }
    return nil
}}

1

Sto scrivendo questo per coloro che hanno ancora problemi con le soluzioni qui.

Sto usando Xcode versione 11.4 (11E146). Quello che lavora per me è:

navigationController?.navigationBar.barTintColor = UIColor.white
navigationController?.navigationBar.tintColor = UIColor.black

MA !, se si imposta barTintColor nello storyboard su un valore diverso da "predefinito", queste 2 righe di codice non avranno alcun effetto.

Quindi, fai attenzione e torna alla barra di default ColorColor in Storyboard. Oh mela ...


Sempre lo stesso problema nonostante la modifica del colore della tinta al valore predefinito :(
marika.daboja,

@ marika.daboja Tutti i controller di navigazione nello storyboard sono impostati sui colori predefiniti?
Tomas Cordoba,

Ciao, ho solo 1 controller di navigazione (più 2 controller di visualizzazione tabella). Barra del controller di navigazione Il colore della tinta è impostato su "predefinito". Il codice che devo aggiornare questo colore sembra non influire su di esso.
marika.daboja,

@ marika.daboja assicurati che navigationController non sia nulla. E che hai messo queste righe di codice in viewDidLoad ()
Tomas Cordoba il

0

Aggiungi queste righe al tuo AppDelegate all'interno della funzione didFinishLaunchingWithOptions:

questa linea è per lo sfondo della barra di navigazione.

UINavigationBar.appearance().barTintColor = .orange

questa linea è se il tuo non è Traslucido su falso mostrerà il colore bianco sulla navigazione.

UINavigationBar.appearance().tintColor = .white

questa linea è per i tuoi testi e icone sulla barra di navigazione

UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: Styles.textFirstColor]

questa linea ci fa scendere tutto nella barra di navigazione.

UINavigationBar.appearance().isTranslucent = false
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.