如何在Catalina的自动外观模式下检测OSX是处于暗还是亮模式

时间:2019-08-01 06:52:09

标签: macos cocoa macos-catalina

我的Mac应用需要根据亮或暗模式更改行为。

在macOS Catalina中将外观选项选择为自动时,检测样式的最佳方法是什么?

NSDictionary *dict = [[NSUserDefaults standardUserDefaults] persistentDomainForName:NSGlobalDomain];
id style = [dict objectForKey:@"AppleInterfaceStyle"];

BOOL darkModeOn = ( style && [style isKindOfClass:[NSString class]] && NSOrderedSame == [style caseInsensitiveCompare:@"dark"] );

即使从黑暗外观切换为自动外观选项后,darkModeOn仍为是/黑暗。

2 个答案:

答案 0 :(得分:1)

在macOS中,查找当前有效外观(实际显示的内容)的最佳方法是查看NSApplication.effectiveAppearance。该值可以用KVO观察到,并且可以通过NSApp单例来访问。一篇不错的文章,介绍了如何观察这些Supporting Dark Mode: Responding to Change的变化,其中涉及到观察此特定值。

macOS的一般注意事项:从全局用户首选项中读取配置设置将为您提供上次存储的内容,但无法获得操作系统当前对该值的任何解释(正如您在本示例中所展示的那样)例如,可以随时间推移而变化)。这就是您在这里遇到的问题。通常,如果您发现自己在NSUserDefaults中读取了API中未定义的键,则应该寻找另一种方法。

答案 1 :(得分:1)

您需要将AppleInterfaceStyleSwitchesAutomatically与macOS Catalina 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 中引入的新值结合起来。

这是一些伪代码,说明如何:

struct someStruct {
char path[10][MAXPATHLEN];
};

您可以在以下位置查看macOS示例应用程序:https://github.com/ruiaureliano/macOS-Appearance

干杯?