Мое приложение cocoa должно изменить свое поведение при запуске в новом темном режиме OS X.
Есть ли способ определить, установлен ли стиль OS X для этого режима?
Мое приложение cocoa должно изменить свое поведение при запуске в новом темном режиме OS X.
Есть ли способ определить, установлен ли стиль OS X для этого режима?
Не думайте, что есть способ cocoa обнаружить его, но вы можете использовать defaults read
, чтобы проверить, находится ли OSX в темном режиме.
defaults read -g AppleInterfaceStyle
Либо возвращает Dark
(темный режим), либо не возвращается пара доменов.
EDIT:
Как сказал Кен Томазес, вы можете получить доступ к .GlobalPreferences через NSUserDefaults, поэтому
NSString *osxMode = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"];
Если osxMode nil
, то он не находится в темном режиме, но если osxMode @"Dark"
, то он находится в темном режиме.
Swift 2 → String ( "Темный", "Свет" )
let appearance = NSUserDefaults.standardUserDefaults().stringForKey("AppleInterfaceStyle") ?? "Light"
Swift 3 → Enum (Темный, Светлый)
enum InterfaceStyle : String {
case Dark, Light
init() {
let type = UserDefaults.standard.string(forKey: "AppleInterfaceStyle") ?? "Light"
self = InterfaceStyle(rawValue: type)!
}
}
let currentStyle = InterfaceStyle()
Вы можете обнаружить это с помощью NSAppearanceCustomization
метода effectiveAppearance
, путем проверки darkAqua
.
Swift 4 пример:
extension NSView {
var isDarkMode: Bool {
if #available(OSX 10.14, *) {
if effectiveAppearance.name == .darkAqua {
return true
}
}
return false
}
}
Вы также можете обернуть его в логическое значение, если вам не хочется иметь дело с перечислениями и операторами 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"
}
Работает на Swift 4.2
Это работает:
if #available(OSX 10.14, *) {
inputTextView.textColor = (NSApp.effectiveAppearance.name == NSAppearance.Name.darkAqua ? NSColor.white : NSColor.black)
}
Для работы с новой macOS Catalina вам нужно объединить AppleInterfaceStyle
с этим новым введенным значением AppleInterfaceStyleSwitchesAutomatically
.
Вот некоторый псевдокод, объясняющий, как:
theme = light //default is light
if macOS_10.15
if UserDefaults(AppleInterfaceStyleSwitchesAutomatically) == TRUE
if UserDefaults(AppleInterfaceStyle) == NIL
theme = dark // is nil, means it dark and will switch in future to light
else
theme = light //means it 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
Вы можете проверить пример приложения MacOS здесь: https://github.com/ruiaureliano/macOS-Appearance.
Ура 💪
Я Руи Аурелиано, iOS & инженер MacOS в @OlaBrothers. Создатель http://sipapp.io
Взгляните на NSAppearance.Name (на языке Swift) - Есть варианты:
.darkAqua
.accessibilityHighContrastDarkAqua
.accessibilityHighContrastVibrantDark
Я бы проверил против всех темных явлений, как так
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
}
}
}
}