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.
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?
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
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.
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()
}