如何在Xcode(Swift)中读取OS X菜单栏的用户选择

时间:2015-08-25 20:20:30

标签: swift osx-yosemite nsstatusitem

我在swift中为OS X创建代理应用程序(仅显示菜单栏中的应用程序图标)。我使用以下方法从AppDelegate加载应用程序的图标:

 statusItem.image = NSImage(named: "BlackIcon")

它工作正常。

但是,如果用户选择使用系统偏好设置中的暗菜单栏 - >一般情况下,用户不会将图标视为黑色。

enter image description here

所以我需要展示一个不同的' WhiteIcon'如果他们选择了该选项,则为该用户。

如何检查用户是否在我的应用中启用了此选项?

2 个答案:

答案 0 :(得分:3)

使用Swift 3.0,您可以使用UserDefaults使用以下代码访问macOS外观或" AppleInterfaceStyle":

let mode = UserDefaults.standard.string(forKey: "AppleInterfaceStyle")

如果用户启用了暗模式,则默认值将返回一个字符串" Dark"。如果他们有"灯光模式"启用它将返回nil。因此,您需要将其包含在以下代码中:

if UserDefaults.standard.string(forKey: "AppleInterfaceStyle") == "Dark" {
    statusItem.image = NSImage(named: "WhiteIcon")
} else {
    statusItem.image = NSImage(named: "BlackIcon")
}

我确定可能会有一个更干净的方式,也许有一个警卫,但这将让你到达你需要在Swift 3.0中的位置

修改

以上代码将确定用户当前"模式"。但是,使用对用户首选项的简单检查不会导致正确的行为(例如,只有在应用程序启动时才会触发)。

执行此操作的正确方法是将菜单图标设置为黑色图标。然后,浏览资产目录中的资产,并选择菜单图标。选择菜单后,浏览到属性检查器并确保使用“Mac”设备检查图像。然后选择“渲染为”设置为“模板图像”。

这只需要你有一个黑色的图标,而macOS将处理从暗到亮模式的图像转换。

Image Attributes Inspector

答案 1 :(得分:1)

您似乎正在尝试将暗模式的菜单图标颜色反转。默认情况下,OSX处理黑暗模式并反转图像颜色,但是你需要专门添加[image setTemplate:YES]才能让它为你工作(如果它已经不存在)。

目标-C:

self.statusItem = [[NSStatusBar systemStatusBar]     
statusItemWithLength:NSSquareStatusItemLength];
NSImage *image = [NSImage imageNamed:@"statusItemIcon"];
[image setTemplate:YES];
[self.statusItem setImage:image];
迅速:(最初由蔡志伟在下面的链接中回答)

var isDark = false

func isDarkMode() {
  // Swift2
  // isDark = NSAppearance.currentAppearance().name.hasPrefix("NSAppearanceNameVibrantDark") 

  // Swift3+
  isDark = NSAppearance.current.name.rawValue.hasPrefix("NSAppearanceNameVibrantDark") 
}

override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
isDarkMode()
// Now use "isDark" to determine the drawing colour.
if isDark {
    // ...
 } else {
    // ...
 }
}

这个答案详细解释了它:NSStatusItem change image for dark tint