web-dev-qa-db-fra.com

Modification de la couleur de la barre de navigation dans Swift

J'utilise une vue Sélecteur pour permettre à l'utilisateur de choisir le thème de couleur pour l'application entière. Je prévois de changer la couleur de la barre de navigation, de l’arrière-plan et éventuellement de la barre d’onglet (si cela est possible). J'ai cherché comment faire cela, mais je n'ai trouvé aucun exemple Swift. Quelqu'un pourrait-il me donner un exemple du code que je devrais utiliser pour modifier la couleur de la barre de navigation et la couleur du texte de la barre de navigation? (La vue Sélecteur est configurée, je cherche simplement le code pour changer les couleurs de l'interface utilisateur)

Merci.

209
user3746428

Barre de navigation:

navigationController?.navigationBar.barTintColor = UIColor.green

Remplacez greenColor par l’UIColor de votre choix. Vous pouvez aussi utiliser un RVB si vous préférez.

Texte de la barre de navigation:

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

Remplacez orangeColor par la couleur de votre choix.

Barre d'onglets:

tabBarController?.tabBar.barTintColor = UIColor.brown

Texte de la barre d'onglets:

tabBarController?.tabBar.tintColor = UIColor.yellow

Sur les deux derniers, remplacez brownColor et yellowColor par la couleur de votre choix.

448
trumpeter201

Voici quelques personnalisations d’apparences très simples que vous pouvez appliquer à l’application large:

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

En savoir plus sur UIAppearance API dans Swift, vous pouvez le lire ici: https://developer.Apple.com/documentation/uikit/uiappearance

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

Collez simplement cette ligne dans didFinishLaunchingWithOptions dans votre code.

49
Mohit tomar

Mis à jour pour Swift 3, 4 & 4.2

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

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

Vous pouvez également vérifier ici: https://github.com/hasnine/iOSUtilitiesSource

44
Jamil Hasnine Tamim

Dans AppDelegate, cela a globalement changé le format de la barre de navigation et supprime la ligne de fond/bordure (qui est un problème pour la plupart des gens) pour vous donner ce que je pense que vous et d'autres recherchent:

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

Ensuite, vous pouvez configurer un fichier Constants.Swift, contenant une structure Style avec des couleurs, des polices, etc. Vous pouvez ensuite ajouter une tableView/pickerView à tout ViewController et utiliser le tableau "availableThemes" pour permettre à l'utilisateur de changer le themeColor.

La belle chose à propos de cela est que vous pouvez utiliser une référence dans toute votre application pour chaque couleur. Elle se mettra à jour en fonction du "Thème" sélectionné par l'utilisateur. Sans cette valeur, la valeur par défaut est 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) } ...
25
David West

Pour ce faire sur le storyboard (interface Builder Inspector)

Avec l'aide de IBDesignable, nous pouvons ajouter d'autres options à l'Inspecteur Builder d'Interface pour UINavigationController et les ajuster sur le scénarimage. Tout d’abord, ajoutez le code suivant à votre projet.

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

Il vous suffit ensuite de définir les attributs du contrôleur de navigation sur le storyboard.

enter image description here

Cette approche peut également être utilisée pour gérer la couleur du texte de la barre de navigation à partir du 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
Fangming
UINavigationBar.appearance().barTintColor

a travaillé pour moi

15
Asbar

Swift 4:

Code fonctionnant parfaitement pour modifier l'apparence de la barre de navigation au niveau de l'application.

enter image description here

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

Bon codage!

14
Gaurav Singla

Swift 4 - Transition douce (meilleure solution):

Si vous revenez d'un contrôleur de navigation et que vous devez définir une couleur différente sur le contrôleur de navigation utilisé, vous souhaitez utiliser

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

au lieu de le mettre dans la vueWillAppear afin que la transition soit plus propre.

Swift 4.2

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

Utilisez l’API d’apparence et la couleur barTintColor.

UINavigationBar.appearance().barTintColor = UIColor.greenColor()
8
Michael Peterson

Dans Swift 4

Vous pouvez changer la couleur de la barre de navigation. Il suffit d’utiliser cet extrait de code ci-dessous dans viewDidLoad()

Couleur de la barre de navigation

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

Couleur du texte de la barre de navigation

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

Pour Barre de navigation pour les gros titres iOS 11, vous devez utiliser la propriété largeTitleTextAttributes.

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

La fonction apparence () ne fonctionne pas toujours pour moi. Je préfère donc créer un objet CN et modifier ses attributs.

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

Aussi, si vous voulez ajouter une image au lieu d'un texte, cela fonctionne aussi

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
8
GuiSoySauce

Si vous avez un contrôleur de navigation personnalisé, vous pouvez utiliser l’extrait de code ci-dessus. Donc, dans mon cas, j'ai utilisé les morceaux de code suivants.

Swift 3.0, version XCode 8.1

navigationController.navigationBar.barTintColor = UIColor.green

Texte de la barre de navigation:

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

Ce sont des entretiens très utiles.

4

Mise à jour de Swift 4, iOS 12 et Xcode 1

Il suffit de mettre une ligne à l'intérieur de viewDidLoad()

navigationController?.navigationBar.barTintColor = UIColor.red
4
Xcodian Solangi

iOS 8 (Swift)

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
Long Pham

Swift 3

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

Cela définira la couleur de votre barre de navigation comme celle de la barre Facebook :)

3
Sazzad Hissain Khan

Swift 3 et Swift 4 Compatible Xcode 9

ne meilleure solution pour créer une classe pour les barres de navigation communes

J'ai 5 contrôleurs et chaque titre de contrôleur est changé en couleur orange. Comme chaque contrôleur a 5 contrôleurs de navigation, j'ai donc dû changer chaque couleur, que ce soit d'inspecteur ou de code.

J'ai donc créé une classe au lieu de changer chaque barre de navigation du code que je viens d’affecter à cette classe et cela a fonctionné avec les 5 capacités de réutilisation du code du contrôleur.Vous devez juste assigner cette classe à Each contrôleur et thats it.

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]

 }


  }
3
Ourang-Zeb Khan

Dans Swift 2

Pour changer de couleur dans la barre de navigation,

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

Pour changer de couleur dans la barre de navigation,

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

ou

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

iOS 10 Swift 3.0

Si cela ne vous dérange pas d'utiliser les frameworks Swift, alors nous INeraida pour changer le fond de navigation comme UIColor ou HexColor ou UIImage et changer le texte du bouton de navigation arrière par programme, change complète la couleur du texte de fond.

Pour 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
user7304558

Swift

Une doublure simple que vous pouvez utiliser dans ViewDidLoad()

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

Je devais faire

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

sinon la couleur de fond ne changerait pas

1
Guilherme Carvalho

Définissez d'abord la propriété isTranslucent de navigationBar sur false pour obtenir la couleur souhaitée. Puis changez la couleur de la barre de navigation comme ceci:

@IBOutlet var NavigationBar: UINavigationBar!

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

Assurez-vous de définir le État du bouton pour .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)
    }
}

P.S iOS 12, Xcode 10.1

0
Mazen Kasser

Essayez ceci dans 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
}
0
Tej Patel