web-dev-qa-db-fra.com

Xcode 11 - Configuration du mode sombre de SwiftUI

D'accord. Je sais que cela ne devrait pas être sorcier. Je n'arrive pas à faire fonctionner le mode sombre et j'ai lu la documentation plusieurs fois. En espérant que quelqu'un puisse découvrir ce qui me manque.

J'ai une couleur nommée dans le catalogue d'actifs . enter image description here

J'ai réglé mon mode plist pour qu'il soit en mode sombre pour un test plus facile. enter image description here

Ma vue de contenu ressemble à ceci:

struct ContentView : View {
var body: some View {
    VStack {
        Text("Hello World")
        Text("Yo yo yo")
            .color(Color("darkModeColor"))
    }

}

}

Peu importe ce que je fais, la couleur est TOUJOURS de l'apparence "N'importe" quand elle devrait prendre la couleur cyan.

enter image description here

Je sais que le mode sombre lui-même fonctionne parce que toutes les couleurs sémantiques du système fournissent par Apple fonctionne très bien car vous pouvez voir le texte "Hello World" changé en blanc.

Avez-vous des idées sur ce qui me manque ou quelqu'un d'autre rencontre-t-il ce problème avec Xcode 11 Beta 1?

9
Craig Fisher

Il s'agit probablement d'un bogue dans cette version bêta de Xcode 11. J'ai essayé la fonction de mode sombre dans une application UIKit et elle fonctionne parfaitement en utilisant UIColor mais la même couleur ne fonctionnerait pas en utilisant Color dans SwiftUI. Espérons que cela sera corrigé dans les prochaines versions.


Mise à jour: Ce problème a été résolu avec Xcode 11 beta.

11

Une solution de travail (mais assez verbeuse) que nous pouvons utiliser pour surmonter cette limitation actuelle consiste à étendre Color avec des méthodes paramétrées avec le jeu de couleurs actuel comme suit:

import SwiftUI

extension Color {

    static let lightBackgroundColor = Color(white: 1.0)

    static let darkBackgroundColor = Color(white: 0.0)

    static func backgroundColor(for colorScheme: ColorScheme) -> Color {
        if colorScheme == .dark {
            return darkBackgroundColor
        } else {
            return lightBackgroundColor
        }
    }
}

Et dans les vues où vous devez accéder à ces couleurs, vous devez ajouter une propriété d'environnement pour le jeu de couleurs et l'utiliser pour récupérer la couleur dynamique:

import SwiftUI

struct ColoredView : View {

    @Environment(\.colorScheme) var colorScheme: ColorScheme

    var body: some View {
        Rectangle().fill(Color.backgroundColor(for: self.colorScheme))
    }
}

Ces couleurs définies dans le code fonctionnent pour les aperçus Xcode ainsi que pour le simulateur.

3
l_priebe