Cambiar el color de la barra de navegación en Swift


240

Estoy usando una vista de selector para permitir al usuario elegir el tema de color para toda la aplicación.

Estoy planeando cambiar el color de la barra de navegación, el fondo y posiblemente la barra de pestañas (si eso es posible).

He estado investigando cómo hacer esto, pero no puedo encontrar ningún ejemplo de Swift. ¿Podría alguien darme un ejemplo del código que necesitaría usar para cambiar el color de la barra de navegación y el color del texto de la barra de navegación?

La Vista del selector está configurada, solo estoy buscando el código para cambiar los colores de la interfaz de usuario.

Respuestas:


526

Barra de navegación:

navigationController?.navigationBar.barTintColor = UIColor.green

Reemplace greenColor con el UIColor que desee, también puede usar un RGB si lo prefiere.

Texto de la barra de navegación:

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

Reemplace orangeColor con el color que desee.

Barra de pestañas:

tabBarController?.tabBar.barTintColor = UIColor.brown

Texto de la barra de pestañas:

tabBarController?.tabBar.tintColor = UIColor.yellow

En los dos últimos, reemplace brownColor y yellowColor con el color que prefiera.


¡Muchas gracias! No estaba muy lejos con lo que estaba intentando, pero no tenía las cosas en el orden correcto.
user3746428

No estoy seguro. Si está utilizando un segue push en lugar de un modal, debería ser la misma barra de navegación, pero no estoy completamente seguro. Lo siento.
trompetista201

2
Después de actualizar a las versiones beta más nuevas de Xcode, la configuración del color del texto del título ya no funciona. titleTextAttributes no está disponible en Swift. ¿Algunas ideas?
user3746428

1
¿Podría abrir una nueva pregunta y quizás vincularla? El chat no es el mejor lugar para algo como esto.
trompetista201

3
Descubrí que me está haciendo usar NSForegroundColorAttributeName como el nombre del atributo, pero por lo demás funciona muy bien.
Jake Hall

90

Aquí hay algunas personalizaciones de apariencia muy básicas que puede aplicar en toda la aplicación:

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();

UIAppearancePuede leer más sobre API en Swift aquí: https://developer.apple.com/documentation/uikit/uiappearance


Entonces, ¿cómo usaría esto para cambiar el color de la barra de navegación para toda la aplicación? Por el momento solo tengo: self.navigationController.navigationBar.barTintColor = UIColor.newBlueColor () y, por supuesto, esto solo cambia el color de la barra de navegación del controlador de vista en el que se encuentra el código. ¿Cómo puedo usarlo para cambiar todas las barras de navegación? Intenté usar: UINavigationBar.appearance (). BackgroundColor = UIColor.newBlueColor () pero no parece hacer nada.
user3746428

44
Para reflejar cambios en la aplicación entier, pegue lo anterior en el siguiente método de la aplicación AppDelegate.swift func (aplicación: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {// Coloque el código anterior}
Badrinath

77
Use barTintColor en lugar de backgroundColor. UINavigationBar.appearance (). BarTintColor = UIColor.greenColor ()
Michael Peterson

@Keenle Estoy un poco confundido ... ¿Por qué el cambio del color de fondo de UINavigationBar a través de la API de apariencia no cambia su color por completo? Traté de establecer el color de fondo en azul y me dio un tono extraño de azul púrpura ...
fja

60

Actualizado para 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

También puede consultar aquí: https://github.com/hasnine/iOSUtilitiesSource


Swift 4.2: NSAttributedString.Key.foregroundColor
Kasra Babaei

establecer el color del tinte en blanco en lugar de bartintcolor muestra el color original. ¡Excelente!
NickCoder

@NickCoder lo aprecio. :) también revise mi 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()]

Simplemente pegue esta línea didFinishLaunchingWithOptionsen su código.


Intenté esto con RGB y no funciona sin importar dónde lo coloque.
Nathan McKaskle

@NathanMcKaskle Verifique su RGB, debe estar en formato "xx / 250.0f".
Mohit Tomar

Utilizado en didFinishLaunchingWithOptions y funcionó perfectamente. Vista interiorDidLoad no funciona perfectamente.
Touhid

26

Dentro de AppDelegate , esto ha cambiado globalmente el formato de la barra de navegación y elimina la línea de fondo / borde (que es un área problemática para la mayoría de las personas) para darle lo que creo que usted y otros están buscando:

 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()] }

Entonces puedes configurar un Constants.swift archivo , y está contenido una estructura de Estilo con colores y fuentes, etc. Luego puede agregar un TableView / pickerView a cualquier ViewController y usar la matriz "availableThemes" para permitir al usuario cambiar themeColor.

Lo bueno de esto es que puede usar una referencia en toda su aplicación para cada color y se actualizará en función del "Tema" seleccionado por el usuario y sin uno, el valor predeterminado es 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
Gracias hombre, tu respuesta realmente me ayudó al menos para mí. Usé la primera parte y fue increíble y muy útil
Ameer Fares

1
Muchas gracias hombre, probé todas las respuestas aquí y ninguna funcionó excepto la tuya: D
Ronak Shah

19

Para hacer esto en storyboard (Inspector del generador de interfaces)

Con la ayuda de IBDesignable, podemos agregar más opciones a Interface Builder Inspector UINavigationControllery ajustarlas en el guión gráfico. Primero, agregue el siguiente código a su proyecto.

@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
        }
    }
}

Luego simplemente configure los atributos para el controlador de navegación en el guión gráfico.

ingrese la descripción de la imagen aquí

Este enfoque también se puede usar para administrar el color del texto de la barra de navegación del guión gráfico:

@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:

Código que funciona perfectamente para cambiar la apariencia de la barra de navegación a nivel de aplicación.

ingrese la descripción de la imagen aquí

// 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

¡Feliz codificación!


16
UINavigationBar.appearance().barTintColor

trabajó para mi


15

SWIFT 4 - Transición suave (la mejor solución):

Si se está moviendo hacia atrás desde un controlador de navegación y tiene que establecer un color diferente en el controlador de navegación que presionó desde el que desea usar

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

en lugar de ponerlo en la vista Aparecerá para que la transición sea más limpia.

SWIFT 4.2

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

11

En Swift 4

Puede cambiar el color de la barra de navegación. Solo use este fragmento de código a continuación enviewDidLoad()

Color de la barra de navegación

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

Color de texto de la barra de navegación

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

Para iOS 11 Large Title Navigation Bar , debe usar la largeTitleTextAttributespropiedad

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

9

La appearance()función no siempre funciona para mí. Entonces prefiero crear un objeto NC y cambiar sus atributos.

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()]

Además, si desea agregar una imagen en lugar de solo texto, eso también funciona

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

de esa manera, pude cambiar el color de self.navigationController? .navigationBar.topItem? .title. Gracias.
Oguzhan

8

Utilice la API de apariencia y el color barTintColor.

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

4

iOS 8 (rápido)

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

Si tiene un controlador de navegación personalizado, puede usar el fragmento de código anterior. Entonces, en mi caso, he usado las siguientes piezas de código.

Swift 3.0, versión XCode 8.1

navigationController.navigationBar.barTintColor = UIColor.green

Texto de la barra de navegación:

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

Es muy útil las conversaciones.


4

Actualización de Swift 4, iOS 12 y Xcode 10

Solo pon una línea adentro viewDidLoad()

navigationController?.navigationBar.barTintColor = UIColor.red

3

En Swift 2

Para cambiar el color en la barra de navegación,

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

Para cambiar el color en la barra de navegación del 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)

Esto configurará el color de la barra de navegación como el color de la barra de Facebook :)


3

Swift 3 y Swift 4 Compatible Xcode 9

Una mejor solución para esto es hacer una clase para barras de navegación comunes

Tengo 5 controladores y cada título de controlador se cambia a color naranja. Como cada controlador tiene 5 controladores de navegación, tuve que cambiar cada color del inspector o del código.

Así que hice una clase en lugar de cambiar cada una de las barras de navegación del código, simplemente asigné esta clase y funcionó en los 5 controladores. Solo tiene que asignar esta clase a cada controlador y eso es todo.

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

Si no le importa a los marcos de uso veloces luego nos UINeraida a fondo el cambio de navegación como UIColoro HexColoro UIImagey el cambio de navegación de texto botón de retroceso mediante programación, cambiar el color del texto completo forground.

por 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

Un forro simple que puedes usar en ViewDidLoad()

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

2

Esta versión también elimina la línea de sombra de 1px debajo de la barra de navegación:

Swift 5: Ponga esto en su 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

Tenía que hacer

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

de lo contrario, el color de fondo no cambiaría


1

Primero configure la propiedad isTranslucent de navigationBar en false para obtener el color deseado. Luego cambie el color de la barra de navegación de esta manera:

@IBOutlet var NavigationBar: UINavigationBar!

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

1

Asegúrese de establecer el estado del botón para .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
Gracias. Llevo horas buscando esta topItemsolución. Es frustrante la cantidad de cambios que Apple continúa haciendo en la forma en que se aplican los estilos a la navegación.
Aplicación Dev Guy

1

simplemente llame a esta extensión y pase el color, cambiará automáticamente el color de la barra de navegación

extension UINavigationController {

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

en la vista didload o en viewwill aparecerá llamada

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


1

Pruebe esto en 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]
    //        }
}

Extensiones

extension UIApplication {

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

1

Estoy escribiendo esto para aquellos que todavía tienen problemas con las soluciones aquí.

Estoy usando Xcode versión 11.4 (11E146). El que trabaja para mí es:

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

¡PERO !, si configura el barTintColor en el guión gráfico a cualquier otro valor que no sea "predeterminado", estas 2 líneas de código no tendrán efecto.

Por lo tanto, tenga cuidado y vuelva a establecer el valor predeterminado barTintColor en Storyboard. Oh Apple ...


Sigue siendo el mismo problema a pesar de cambiar el color del tinte al predeterminado :(
marika.daboja

@ marika.daboja ¿Todos sus controladores de navegación en storyboard están configurados con los colores predeterminados?
Tomás Córdoba

Hola, solo tengo 1 controlador de navegación (más 2 controladores de vista de tabla). El color de tinte de la barra del controlador de navegación está configurado como 'predeterminado'. El código que tengo para actualizar este color parece no afectarlo.
marika.daboja

@ marika.daboja asegúrate de que navigationController no sea nulo. Y que pones estas líneas de código a la vistaDidLoad ()
Tomás Córdoba

0

Agregue estas líneas a su AppDelegate dentro de la función didFinishLaunchingWithOptions:

esta línea es para el fondo de su barra de navegación.

UINavigationBar.appearance().barTintColor = .orange

esta línea es si su no es Translúcido a falso, mostrará un color blanco en la navegación.

UINavigationBar.appearance().tintColor = .white

esta línea es para tus textos e íconos en la barra de navegación

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

esto nos lleva a bajar todo a su barra de navegación.

UINavigationBar.appearance().isTranslucent = false
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.