web-dev-qa-db-fra.com

Comment détecter si OS X est en mode sombre?

Mon application cacao doit changer de comportement lorsqu'elle est exécutée dans le nouveau "mode sombre" d'OS X.

Existe-t-il un moyen de détecter si le style OS X est défini sur ce mode?

41
Augustus1

Ne pensez pas qu'il existe encore un moyen cacao de le détecter, mais vous pouvez utiliser defaults read pour vérifier si OSX est en mode sombre ou non.

defaults read -g AppleInterfaceStyle

Soit renvoie Dark (mode sombre), soit renvoie une paire de domaines qui n'existe pas.

MODIFIER:

Comme l'a dit Ken Thomases, vous pouvez accéder à .GlobalPreferences via NSUserDefaults, donc

NSString *osxMode = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"];

Si osxMode est nil, il n'est pas en mode sombre, mais si osxMode est @"Dark" alors il est en mode sombre.

64

Swift 2 -> String ("Dark", "Light")

let appearance = NSUserDefaults.standardUserDefaults().stringForKey("AppleInterfaceStyle") ?? "Light"

Swift 3 -> Enum (foncé, clair)

enum InterfaceStyle : String {
   case Dark, Light

   init() {
      let type = UserDefaults.standard.string(forKey: "AppleInterfaceStyle") ?? "Light"
      self = InterfaceStyle(rawValue: type)!
    }
}

let currentStyle = InterfaceStyle()
36
Andrey

Vous pouvez le détecter en utilisant la méthode NSAppearanceCustomizationeffectiveAppearance, en vérifiant darkAqua.

Exemple de Swift 4:

extension NSView {
    var isDarkMode: Bool {
        if #available(OSX 10.14, *) {
            if effectiveAppearance.name == .darkAqua {
                return true
            }
        }
        return false
    }
}
15
James Eunson

Vous pouvez également l'encapsuler dans un booléen si vous n'avez pas envie de traiter les énumérations et les instructions switch:

/// True if the application is in dark mode, and false otherwise
var inDarkMode: Bool {
    let mode = UserDefaults.standard.string(forKey: "AppleInterfaceStyle")
    return mode == "Dark"
}

Fonctionne sur Swift 4.2

9
J.beenie

Je vérifierais contre toutes les apparences sombres comme ça

extension NSView {

    var hasDarkAppearance: Bool {
        if #available(OSX 10.14, *) {
            switch effectiveAppearance.name {
            case .darkAqua, .vibrantDark, .accessibilityHighContrastDarkAqua, .accessibilityHighContrastVibrantDark:
                return true
            default:
                return false
            }
        } else {
            switch effectiveAppearance.name {
            case .vibrantDark:
                return true
            default:
                return false
            }
        }
    }
}
8
Erik Aigner

Pour travailler avec le nouveau macOS Catalina, vous devez combiner AppleInterfaceStyle avec cette nouvelle valeur introduite AppleInterfaceStyleSwitchesAutomatically.

Voici un pseudo-code expliquant comment:

theme = light //default is light
if macOS_10.15
    if UserDefaults(AppleInterfaceStyleSwitchesAutomatically) == TRUE
        if UserDefaults(AppleInterfaceStyle) == NIL
            theme = dark // is nil, means it's dark and will switch in future to light
        else
            theme = light //means it's light and will switch in future to dark
        endif
    else
        if UserDefaults(AppleInterfaceStyle) == NIL
            theme = light
        else
            theme = dark
        endif
    endif
else if macOS_10.14
    if UserDefaults(AppleInterfaceStyle) == NIL
        theme = light
    else
        theme = dark
    endif
endif

Vous pouvez vérifier un exemple d'application macOS ici: https://github.com/ruiaureliano/macOS-Appearance .

À votre santé ????


Je suis Rui Aureliano , ingénieur iOS et macOS chez @OlaBrothers. Créateur de http://sipapp.io

4
ruiaureliano

Cela marche:

if #available(OSX 10.14, *) {
    inputTextView.textColor = (NSApp.effectiveAppearance.name == NSAppearance.Name.darkAqua ? NSColor.white : NSColor.black)
}
3
leo.tan

2020 | Swift 5.1:

ne se met pas à jour en temps réel pour une raison quelconque, mais fonctionne toujours selon les besoins (peut-être un problème à un autre endroit, non lié à ce code):

vérifier le thème de la lumière:

#available(OSX 10.14, *)
static private var isLight: Bool { NSApp.effectiveAppearance.name == NSAppearance.Name.aqua }

vérifier le thème sombre:

#available(OSX 10.14, *)
static private var isDark: Bool { NSApp.effectiveAppearance.name == NSAppearance.Name.darkAqua }

1
Andrew

Jetez un œil à NSAppearance.Name (in Swift speak) - il existe des variantes:

.darkAqua

.accessibilityHighContrastDarkAqua

.accessibilityHighContrastVibrantDark

1
Bjoern Kriews

Ce n'est pas une réponse complète à la question parce que le questionneur ne dit pas quel est son cas d'utilisation. S'ils veulent un comportement complètement différent de leur application, le comportement ci-dessous ne fonctionne pas. Cependant, s'ils veulent seulement changer la couleur d'une vue personnalisée, c'est la manière bénie Apple Apple .

La chose à faire est d'arrêter d'utiliser des couleurs absolues et de commencer à utiliser des couleurs sémantiques. Cela signifie définir un "jeu de couleurs" pour chaque couleur que vous souhaitez utiliser dans le catalogue des ressources. Après avoir défini votre jeu de couleurs, dans l'inspecteur, réglez l'appareil sur "Mac" et l'apparence sur "Tout, clair, foncé". Vous obtiendrez alors trois puits de couleur, "any" est pour les systèmes d'exploitation hérités qui ne prennent pas en charge le mode sombre, "light" et "dark" devraient être évidents.

Voici un exemple:

Defining a colour set that supports dark mode

Cela définit une couleur qui sera blanche en mode sombre et noire en mode clair ou sur les systèmes d'exploitation hérités.

Une fois que vous avez défini un jeu de couleurs, vous pouvez récupérer la couleur dans votre draw(_ dirtyRect:) comme suit:

let strokeColour = NSColor(named: NSColor.Name("gridColour")) ?? NSColor.black

Dans ce qui précède, je prends par défaut le noir si le jeu de couleurs n'existe pas pour traiter le type facultatif de NSColor(named:).

0
JeremyP