Как определить, находится ли OS X в темном режиме?

Мое приложение cocoa должно изменить свое поведение при запуске в новом темном режиме OS X.

Есть ли способ определить, установлен ли стиль OS X для этого режима?

Ответ 1

Не думайте, что есть способ cocoa обнаружить его, но вы можете использовать defaults read, чтобы проверить, находится ли OSX в темном режиме.

defaults read -g AppleInterfaceStyle

Либо возвращает Dark (темный режим), либо не возвращается пара доменов.

EDIT:

Как сказал Кен Томазес, вы можете получить доступ к .GlobalPreferences через NSUserDefaults, поэтому

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

Если osxMode nil, то он не находится в темном режиме, но если osxMode @"Dark", то он находится в темном режиме.

Ответ 2

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()

Ответ 3

Вы можете обнаружить это с помощью NSAppearanceCustomization метода effectiveAppearance, путем проверки darkAqua.

Swift 4 пример:

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

Ответ 4

Вы также можете обернуть его в логическое значение, если вам не хочется иметь дело с перечислениями и операторами 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

Ответ 5

Это работает:

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

Ответ 6

Для работы с новой 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

Ответ 7

Взгляните на NSAppearance.Name (на языке Swift) - Есть варианты:

.darkAqua

.accessibilityHighContrastDarkAqua

.accessibilityHighContrastVibrantDark

Ответ 8

Я бы проверил против всех темных явлений, как так

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
            }
        }
    }
}