web-dev-qa-db-fra.com

Xcode 11.4. La couleur du titre de la navigation est devenue NOIRE du storyboard

J'ai récemment mis à jour mon Xcode vers 11.4. Lorsque j'exécute l'application sur l'appareil, j'ai remarqué que tous les titres de mes éléments de navigation devenaient entièrement noirs lorsqu'ils étaient définis à partir du storyboard. enter image description here

Vous ne pouvez pas changer ni du code, la ligne de code suivante ne fonctionne plus

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

Je le fais uniquement fonctionner en utilisant des éléments iOS 13 UINavigationBarAppearance

@available(iOS 13.0, *)
    private func setupNavigationBar() {
        let app = UINavigationBarAppearance()
        app.titleTextAttributes = [.foregroundColor: UIColor.white]
        app.backgroundColor = Constants.Color.barColor
        self.navigationController?.navigationBar.compactAppearance = app
        self.navigationController?.navigationBar.standardAppearance = app
        self.navigationController?.navigationBar.scrollEdgeAppearance = app

        self.navigationController?.navigationBar.titleTextAttributes = [.foregroundColor: UIColor.white]
    }

Quelqu'un peut-il m'expliquer pourquoi ??? C'est un bug crucial, ou une nouvelle fonctionnalité cachée?

56
Tudor Popa

pas besoin de la solution de contournement, c'est un bogue dans Xcode Interface Builder. Apple version mise à jour pour Xcode 11.4.1

from Apple notes de version pour les développeurs

Constructeur d'interface

Correction d'un problème qui faisait que certaines propriétés d'apparence UINavigationBar définies dans le storyboard et les documents XIB étaient ignorées lors de la construction avec Xcode 11.4. (60883063) (FB7639654)

https://developer.Apple.com/documentation/xcode_release_notes/xcode_11_4_1_release_notes

3
NinjaDeveloper

Semblable à la réponse de Stu Carney le 25/03, j'ai ajouté quelques détails d'implémentation supplémentaires.

Créez une sous-classe de INavigationController. Ajoutez ce qui suit à viewWillAppear:

let isDarkMode = UserDefaults.standard.bool(forKey: "DarkMode")
let titleColor: UIColor = isDarkMode ? .white : .black
let navBarColor: UIColor = isDarkMode ? .black : .white
let tintColor: UIColor = isDarkMode ? .yellow : .red  //back button text and arrow color, as well as right bar button item

if #available(iOS 13.0, *) {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithOpaqueBackground()
    appearance.backgroundColor = navBarColor
    appearance.titleTextAttributes = [.foregroundColor: titleColor]
    appearance.largeTitleTextAttributes = [.foregroundColor: titleColor]

    self.navigationBar.standardAppearance = appearance
    self.navigationBar.scrollEdgeAppearance = appearance
    self.navigationBar.compactAppearance = appearance // For iPhone small navigation bar in landscape.

    self.navigationBar.tintColor = tintColor //changes back button text and arrow color, as well as right bar button item
} else {
    self.navigationBar.barTintColor = navBarColor
    self.navigationBar.tintColor = tintColor
    self.navigationBar.titleTextAttributes = [.foregroundColor: titleColor]
    self.navigationBar.largeTitleTextAttributes = [.foregroundColor: titleColor]
}

Remplacez ensuite preferStatusBarStyle :

override var preferredStatusBarStyle: UIStatusBarStyle {
    let isDarkMode = UserDefaults.standard.bool(forKey: "DarkMode")
    return isDarkMode ? .lightContent : .default
}

Si vous souhaitez mettre à jour dynamiquement la barre de navigation et la barre d'état, comme à partir d'une méthode UISwitch IBAction ou selector, ajoutez ce qui suit:

navigationController?.loadView()
navigationController?.topViewController?.setNeedsStatusBarAppearanceUpdate()

Veillez également à définir toutes vos barres de navigation et boutons de barre sur les couleurs par défaut dans IB. Xcode semble avoir un bogue où les couleurs IB remplacent les couleurs définies par programme.

0
Josh R

Dans mon cas, après avoir mis à niveau Xcode de 11.3 à 11.4, ce bogue s'est produit. Je dois donc changer mon code pour souffler afin de définir une image comme arrière-plan dans la barre de navigation.

if #available(iOS 13.0, *) {
    let appearance = UINavigationBarAppearance()
    appearance.configureWithOpaqueBackground()
    let backgroundImage = UIImage(named: "{NAVBAR_IMAGE_NAME}")?.resizableImage(withCapInsets: UIEdgeInsets.zero, resizingMode: .stretch)
    appearance.backgroundImage = backgroundImage
    self.navigationController?.navigationBar.compactAppearance = appearance
    self.navigationController?.navigationBar.standardAppearance = appearance
    self.navigationController?.navigationBar.scrollEdgeAppearance = appearance        
} else {
    self.navigationController?.navigationBar.barTintColor = Utils.themeColor
    let backgroundImage = UIImage(named: "{NAVBAR_IMAGE_NAME}")?.resizableImage(withCapInsets: UIEdgeInsets.zero, resizingMode: .stretch)
    self.navigationController?.navigationBar.setBackgroundImage(backgroundImage, for: .default)
    self.navigationController?.navigationBar.shadowImage = UIImage()
}
0
Reza Dehnavi