web-dev-qa-db-fra.com

Couleur du titre de la barre de navigation de la mise à jour SwiftUI

Comment changer la couleur du titre de la barre de navigation dans SwiftUI

NavigationView {
            List{
                ForEach(0..<15) { item in
                    HStack {
                        Text("Apple")
                            .font(.headline)
                            .fontWeight(.medium)
                            .color(.orange)
                            .lineLimit(1)
                            .multilineTextAlignment(.center)
                            .padding(.leading)
                            .frame(width: 125, height: nil)


                        Text("Apple Infinite Loop. Address: One Infinite Loop Cupertino, CA 95014 (408) 606-5775 ")
                            .font(.subheadline)
                            .fontWeight(.regular)
                            .multilineTextAlignment(.leading)
                            .lineLimit(nil)


                    }
                }
            }
            .navigationBarTitle(Text("TEST")).navigationBarHidden(false).foregroundColor(.orange)
            }

J'ai essayé avec .foregroundColor(.orange) mais ça ne marche pas

a également essayé .navigationBarTitle(Text("TEST").color(.orange))

De l'aide ?

28

mise à jour pour 13.4

Remarque: en revenant sur ce point le lendemain, il est possible que certains de mes problèmes soient dus à ma configuration quelque peu non standard: j'utilise toujours mojave, mais j'ai ajouté manuellement les fichiers de support 13.4 (normalement disponible uniquement via xcode 11.4, qui nécessite catalina). Je mentionne cela parce que j'ai/j'ai également eu des problèmes de couleur personnalisée dans la barre d'onglets, mais je viens de remarquer que ceux-ci ne se manifestent que lorsque le téléphone est branché et que je lance l'application à partir de xcode. si je débranche et que je lance simplement l'application normalement, je ne vois pas les problèmes de la barre d'onglets, il peut donc être possible que le problème de la barre de navigation soit similaire ...

(J'ajouterais cela comme un commentaire sur la réponse d'Arsenius (celle actuellement acceptée) ci-dessus, mais je n'ai pas le représentant, alors ...)

j'utilisais cette solution, et elle fonctionnait parfaitement jusqu'à 13.4, ce qui semble l'avoir cassée, du moins pour moi. après beaucoup de suivi de la hiérarchie des vues, il semble qu'ils aient changé des choses de telle sorte que l'UINavigationController implicite n'est plus facilement accessible via le UIViewController passé, comme décrit dans la solution de contournement. il est toujours là cependant (assez loin dans l'arbre), il suffit de le trouver.

à cette fin, nous pouvons simplement parcourir la hiérarchie des vues jusqu'à ce que nous trouvions la barre de navigation, puis définir les paramètres souhaités, comme d'habitude. cela nécessite une nouvelle fonction de découverte, et quelques changements mineurs à la structure NavigationConfigurator, et son instanciation ...

tout d'abord, la fonction de découverte:

func find_navbar(_ root: UIView?) -> UINavigationBar?
{
    guard root != nil else { return nil }

    var navbar: UINavigationBar? = nil
    for v in root!.subviews
    {   if type(of: v) == UINavigationBar.self { navbar = (v as! UINavigationBar); break }
        else { navbar = find_navbar(v); if navbar != nil { break } }
    }

    return navbar
}

modifier le NavigationConfigurator comme suit (notez que nous ne nous soucions plus de passer dans une vue, car ce n'est plus fiable):

struct NavigationConfigurator: UIViewControllerRepresentable
{
    @EnvironmentObject var prefs: Prefs     // to pick up colorscheme changes

    var configure: () -> Void = {}
    func makeUIViewController(context: UIViewControllerRepresentableContext<NavigationConfigurator>) -> UIViewController { UIViewController() }
    func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<NavigationConfigurator>) { self.configure() }
}

(dans mon application, j'ai un objet Prefs qui garde une trace des couleurs, etc.)

... puis, sur le site d'instanciation, faites quelque chose comme ceci:

MyView()
    .navigationBarTitle("List", displayMode: .inline)
    .navigationBarItems(trailing: navbuttons)
    .background(NavigationConfigurator {
        if self.prefs.UI_COLORSCHEME != Colorscheme.system.rawValue
        {   if let navbar = find_navbar(root_vc?.view)
            {   navbar.barTintColor = Colors.uicolor(.navbar, .background)
                navbar.backgroundColor = .black
                navbar.titleTextAttributes = [.foregroundColor: Colors.uicolor(.navbar, .foreground)]
                navbar.tintColor = Colors.uicolor(.navbar, .foreground)
            }
        }
    })

notez que je capture le contrôleur de vue racine ailleurs dans mon application et l'utilise ici pour passer à find_navbar (). vous voudrez peut-être le faire différemment, mais j'ai déjà cette variable autour pour d'autres raisons ... il y a d'autres choses spécifiques à mon application, par exemple, les objets liés aux couleurs, mais vous avez l'idée.

0
rnr-a-np