[SWIFT] Soucis avec le changement de couleur d'une TabBar

InsouInsou Membre
février 2018 modifié dans API UIKit #1

Nouvelle semaine, nouveau soucis :D

Je vous explique mon cas..
J'ai 3 vues :
1/ la page de connexion
2/ un menu
3/ une page lorsqu'on choisi un élément du menu

Jusque là, rien de compliqué.

Avant, je passais toujours par la page de connexion quand j'ouvrai mon appli, je devais donc toujours me connecter..
A la connexion, je récupère via une API, les couleurs de l'application (dont la couleur de la TabBar), que je stock dans une clé

defaults.set(maCouleur, forKey: "CouleurApplication_rvb")

ça fonctionnait bien !

Maintenant, le principe de l'application à un peu changé et si je suis déjà connecté, je ne repasse plus par la page de login.
Le soucis, c'est qu'il ne me prends plus la couleur de ma TabBar alors qu'elle est bien stocké dans une clé, que j'arrive bien à la récupérer mais il ne me change pas la couleur.

Mon code pour changer la couleur :

UINavigationBar.appearance().barTintColor = UIColor(red: CouleurApplication_r/255.0, green: CouleurApplication_g/255.0, blue: CouleurApplication_b/255.0, alpha: 1)
UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
UINavigationBar.appearance().tintColor = UIColor.white
UITabBar.appearance().tintColor = UIColor(red: 0.0/255/0, green: 165.0/255.0, blue: 227.0/255.0, alpha: 1.0)

Ce qui est bizarre c'est que si je clic sur un élément du menu, qui m'affiche un autre page, la couleur de la TabBar est bien présente, je retourne donc sur l'accueil et là, la couleur s'est bien mise (alors qu'elle n'y était pas au début)..

Il y a-t-il une fonction pour rafraichir la TabBar quand j'en ai envie ?
J'ai l'impression que je lui assigne la couleur trop tard, qu'elle est déjà chargée et qu'il ne la prend pas en compte :/
Pourtant, je le fais directement dans viewDidLoad, bref.. une idée ?

Mots clés:

Réponses

  • LarmeLarme Membre
    février 2018 modifié #2

    Note
    iOS applies appearance changes when a view enters a window, it doesn’t change the appearance of a view that’s already in a window. To change the appearance of a view that’s currently in a window, remove the view from the view hierarchy and then put it back.

    From UIAppearance Documentation

  • C'est bien ce qu'il me semblait, elle était déjà chargée.

    Du coup, j'ai modifier mon code comme ça :

    // Pour l'accueil, on reconstruit la navBar
    let navBarColor = navigationController!.navigationBar
    navBarColor.barTintColor = UIColor(red: CouleurApplication_r/255.0, green: CouleurApplication_g/255.0, blue: CouleurApplication_b/255.0, alpha: 1)
    navBarColor.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
    navBarColor.tintColor = UIColor.white
    
    // Pour toute l'appli, sauf l'accueil
    UINavigationBar.appearance().barTintColor = UIColor(red: CouleurApplication_r/255.0, green: CouleurApplication_g/255.0, blue: CouleurApplication_b/255.0, alpha: 1)
    UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
    UINavigationBar.appearance().tintColor = UIColor.white
    

    ça fonctionne bien maintenant :)

    Merci Larme pour la piste ^^

  • Au risque de faire mon chieur, évite ce genre de code :

    let navBarColor = navigationController!.navigationBar
    navBarColor.barTintColor = UIColor(red: CouleurApplication_r/255.0, green: CouleurApplication_g/255.0, blue: CouleurApplication_b/255.0, alpha: 1)
    navBarColor.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
    navBarColor.tintColor = UIColor.white

    préfère celui-ci :

    if let navBarColor = navigationController.navigationBar {
       navBarColor.barTintColor = UIColor(red: CouleurApplication_r/255.0, green: CouleurApplication_g/255.0, blue: CouleurApplication_b/255.0, alpha: 1)
       navBarColor.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
       navBarColor.tintColor = UIColor.white
    }
  • Toute amélioration est la bienvenue, t'inquiète pas, tu fais pas ton chieur, au contraire, faut que j'me structure plus dans mon développement et j'oublie souvent de faire ce genre de vérification :/

  • Autre best practice évite aussi :

    navBarColor.barTintColor = UIColor(red: CouleurApplication_r/255.0, green: CouleurApplication_g/255.0, blue: CouleurApplication_b/255.0, alpha: 1)

    essaie de creer une extention de ton UIColor qui permet de te renvoyer la couleur de l'application de telle sorte à avoir
    navBarColor.barTintColor = .colorApplication

  • @Simo a dit :
    Autre best practice évite aussi :
    essaie de creer une extention de ton UIColor qui permet de te renvoyer la couleur de l'application de telle sorte à avoir
    navBarColor.barTintColor = .colorApplication

    Ah oui très bonne remarque ! C'est très pratique, surtout si tu as une multitude de label et que tu décides un jour de modifier la couleur du texte. :smile:

    extension UIColor {
        static var navBarColor: UIColor {
            return UIColor(red: CGFloat(0.5), green: CGFloat(0.2), blue: CGFloat(0.34), alpha: CGFloat(1.0))
        }
    }
    
    navBarColor.barTintColor = .navBarColor
  • C'est surtout pratique dans le cas où j'ai la même couleur à changer plusieurs fois ^^
    Mais en effet, c'est pratique :)

    Merci à vous 2 ^^

  • Après ce que je fais aussi c'est de créer une UINavigationBar custom et de définir ses propriétés lors de l'instanciation de cette dernière. Tu peux en faire de même pour les autres composants.

Connectez-vous ou Inscrivez-vous pour répondre.