Macos 如何检测OSX是否处于暗模式?
我的cocoa应用程序在新的OSX“黑暗模式”下运行时必须改变其行为Macos 如何检测OSX是否处于暗模式?,macos,cocoa,themes,Macos,Cocoa,Themes,我的cocoa应用程序在新的OSX“黑暗模式”下运行时必须改变其行为 有没有办法检测OSX样式是否设置为该模式?现在还没有办法检测它,但是您可以使用默认读取来检查OSX是否处于暗模式 defaults read -g AppleInterfaceStyle 返回暗(暗模式)或返回域对不存在 编辑: 正如Ken Thomases所说,您可以通过NSUserDefaults访问.GlobalPreferences,所以 NSString *osxMode = [[NSUserDefaults st
有没有办法检测OSX样式是否设置为该模式?现在还没有办法检测它,但是您可以使用
默认读取
来检查OSX是否处于暗模式
defaults read -g AppleInterfaceStyle
返回暗
(暗模式)或返回域对不存在
编辑:
正如Ken Thomases所说,您可以通过NSUserDefaults访问.GlobalPreferences,所以
NSString *osxMode = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"];
如果osxMode为nil
则不处于暗模式,但如果osxMode为@“暗”
则处于暗模式。Swift 2->String(“暗”、“亮”)
defaults read -g AppleInterfaceStyle
Swift 3->枚举(暗、亮)
如果不想处理enum和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通过检查
darkAqua
,您可以使用NSAppearanceCustomization
方法effectiveAppearance
检测此问题
Swift 4示例:
extension NSView {
var isDarkMode: Bool {
if #available(OSX 10.14, *) {
if effectiveAppearance.name == .darkAqua {
return true
}
}
return false
}
}
这项工作:
如果可用(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'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
您可以在此处查看macOS示例应用程序:
(免责声明:我是这个示例应用程序的作者。)看看NSAppearance.Name(用Swift说话)- 有几种变体: 达卡夸先生 .accessibilityHighContrastDarkAqua
.accessibility高对比振动黑暗我会检查所有这样的黑暗外观 扩展视图{ var Hasdarkapearance:布尔{ 如果可用(OSX 10.14,*){ 开关effectiveAppearance.name{ case.darkAqua、.vibrantDark、.Accessibility HighContrast darkAqua、.Accessibility HighContrast vibrantDark: 返回真值 违约: 返回错误 } }否则{ 开关effectiveAppearance.name{ 案例.vibrantDark: 返回真值 违约: 返回错误 } } } }
2020 | SWIFT 5.1: 由于某些原因无法实时更新,但仍能根据需要工作(可能是其他地方的问题,与此代码无关): 检查灯光主题:
#available(OSX 10.14, *)
static private var isLight: Bool { NSApp.effectiveAppearance.name == NSAppearance.Name.aqua }
检查黑暗主题:
#available(OSX 10.14, *)
static private var isDark: Bool { NSApp.effectiveAppearance.name == NSAppearance.Name.darkAqua }
这不是问题的完整答案,因为提问者没有说明他们的用例是什么。如果他们想让自己的应用程序有完全不同的行为,下面的行为是行不通的。但是,如果他们只想更改某些自定义视图的颜色,则这是不可能的 我们要做的是停止使用绝对颜色,开始使用语义颜色。这意味着为要在资源目录中使用的每种颜色定义一个“颜色集”。定义颜色集后,在inspector中,将设备设置为“Mac”,并将外观设置为“任意、亮、暗”。然后您将得到三个颜色井,“any”用于不支持暗模式的遗留操作系统,“light”和“dark”应该是明显的 以下是一个例子: 这定义了一种颜色,在黑暗模式下为白色,在光明模式下为黑色,或在传统操作系统上为黑色 定义颜色集后,可以在
绘图(\udirtyrect:)
中检索颜色,如下所示:
let strokeColour = NSColor(named: NSColor.Name("gridColour")) ?? NSColor.black
在上面的例子中,如果颜色集不存在,我将默认为黑色,以处理可选类型的
NSColor(命名:)
stab In the dark-您是否尝试过收听NSScreen colorSpace didchangenotification
或检查NSScreen
colorSpace
属性。目前在Mav上,因此无法进行检查。defaults
命令只是CFPreferences
API的包装,就像NSUserDefaults
一样。因此,您可以使用这些API中的任何一个,而不是调用defaults
@houbysoft use在Catalina上不起作用:“域/默认对(kCFPreferencesAnyApplication,AppleInterfaceStyle)不存在”@bas“不存在”可能表示“亮模式”。我可以确认(在Catalina上),如果在暗模式下,然后defaults read-g AppleInterfaceStyle
返回“暗”,否则返回“域/默认对(kCFPreferencesAnyApplication,AppleInterfaceStyle)不存在”。非常不直观:)整洁,我不知道枚举可以有一个init()
方法!只需为AppleInterfaceTheMechanedNotification
分布式通知添加一个观察者,然后从那里开始。我正在使用[NSAppearance.Name.darkAqua,NSAppearance.Name.vibrantDark].contains(effectiveAppearance.Name)
检查这两种暗外观
let strokeColour = NSColor(named: NSColor.Name("gridColour")) ?? NSColor.black