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?
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.
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()
Vous pouvez le détecter en utilisant la méthode NSAppearanceCustomization
effectiveAppearance
, 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
}
}
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
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
}
}
}
}
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
Cela marche:
if #available(OSX 10.14, *) {
inputTextView.textColor = (NSApp.effectiveAppearance.name == NSAppearance.Name.darkAqua ? NSColor.white : NSColor.black)
}
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 }
Jetez un œil à NSAppearance.Name (in Swift speak) - il existe des variantes:
.darkAqua
.accessibilityHighContrastDarkAqua
.accessibilityHighContrastVibrantDark
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:
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:)
.