我在swift中为OS X创建代理应用程序(仅显示菜单栏中的应用程序图标)。我使用以下方法从AppDelegate加载应用程序的图标:
statusItem.image = NSImage(named: "BlackIcon")
它工作正常。
但是,如果用户选择使用系统偏好设置中的暗菜单栏 - >一般情况下,用户不会将图标视为黑色。
所以我需要展示一个不同的' WhiteIcon'如果他们选择了该选项,则为该用户。
如何检查用户是否在我的应用中启用了此选项?
答案 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将处理从暗到亮模式的图像转换。
答案 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