Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何检测OSX是否处于暗模式?_Macos_Cocoa_Themes - Fatal编程技术网

Macos 如何检测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

我的cocoa应用程序在新的OSX“黑暗模式”下运行时必须改变其行为


有没有办法检测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