web-dev-qa-db-fra.com

Changer dynamiquement la couleur de la barre de navigation iOS (mode sombre)

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.

3
Alk

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

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

func universalWhite() -> UIColor {
   let defaults = UserDefaults.standard
   let darkMode = defaults.bool(forKey: "darkMode")
   if darkMode {
       return .black
   } else {
       return .white
    }
 }
0
Alk

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.

0
Jstngoulet