J'essaie d'implémenter une bascule pour le mode sombre dans mon application - cela impliquerait de basculer la couleur de la barre de navigation sur le noir lorsque le UIViewController
est déjà visible à l'écran. Je sais comment procéder en définissant
UINavigationBar.appearance().barTintColor = .black
UINavigationBar.appearance().tintColor = .white
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
UINavigationBar.appearance().isTranslucent = false
dans l'AppDelegate, cependant, cela ne fonctionnera pas dans ce cas car il doit être fait de manière dynamique.
J'ai aussi essayé navigationController?.navigationBar.barTintColor = UIColor.white
mais cela ne fonctionne pas non plus.
METTRE À JOUR:
Je pense que beaucoup de réponses ont été confondues avec le but de cette question - ce n'est PAS du tout lié au mode sombre iOS13 qui vient d'être publié - c'est une fonctionnalité de mode sombre INDÉPENDANTE que je veux ajouter à mon application (similaire à d'autres des applications comme Messenger, etc., qui avaient le mode sombre disponible dans l'application avant la sortie d'iOS 13). Ce que je dois faire est de mettre à jour dynamiquement la couleur de la barre UINavigation APRÈS qu'elle a déjà été affichée à l'écran, de la même manière que je peux changer la couleur d'arrière-plan d'une vue en faisant view.backgroundColor = .white
et cela mettra à jour la couleur en temps réel à l'écran.
Atteint cela en rendant la barre de navigation translucide (en AppDelegate
):
let barAppearance = UINavigationBar.appearance()
barAppearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: appRed]
barAppearance.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
barAppearance.shadowImage = UIImage()
barAppearance.isTranslucent = true
Ensuite, je crée une vue et la place derrière la barre de navigation comme suit (en utilisant SnapKit):
let coverView = UIView()
cover.snp.makeConstraints {
make in
make.left.right.top.equalTo(self)
make.bottom.equalTo(self.snp.top).offset(universalNumber(num: parent!.topbarHeight))
}
où parent
est mon UIViewController
et topBarHeight
est:
extension UIViewController {
/**
* Height of status bar + navigation bar (if navigation bar exist)
*/
var topbarHeight: CGFloat {
return UIApplication.shared.statusBarFrame.size.height +
(self.navigationController?.navigationBar.frame.height ?? 0.0)
}
}
Enfin, pour mettre à jour la couleur que j'ai définie
coverView.backgroundColor = universalWhite()
où
func universalWhite() -> UIColor {
let defaults = UserDefaults.standard
let darkMode = defaults.bool(forKey: "darkMode")
if darkMode {
return .black
} else {
return .white
}
}
Vous souhaiterez peut-être vérifier les caractéristiques fournies avec UIViewController pour déterminer le style d'interface actuel, au lieu d'une vérification manuelle des versions exécutant iOS 13+. En utilisant cette méthode, vous pouvez définir des couleurs dans votre dossier Assets pour les deux apparences.
Pour les versions inférieures à iOS 13, vous pouvez utiliser quelque chose de similaire à ce que @byaruah a déclaré, mais ce n'est pas un effet global. Vous devriez également envisager d'utiliser la fonctionnalité UINavigationBar.appearance()
pour une approche globale.