如何读取 Xcode 中 OS X 菜单栏的用户选择 (Swift)
How can I read the user selection for OS X menu bar in Xcode (Swift)
我正在 swift 中为 OS X 创建代理应用程序(仅在菜单栏中显示应用程序图标)。我正在使用以下方法从 AppDelegate 加载应用程序的图标:
statusItem.image = NSImage(named: "BlackIcon")
而且效果很好。
但是,如果用户从“系统偏好设置”->“常规”中选择使用深色菜单栏,用户将看不到该图标,因为它是黑色的。
因此,如果用户选择了选项,我需要向他们显示不同的 'WhiteIcon'。
如何检查用户是否在我的应用程序中启用了此选项?
您似乎正在尝试为深色模式反转小菜单图标颜色。默认情况下 OSX 处理暗模式并反转图像颜色,但是您需要专门添加 [image setTemplate:YES] 才能为您工作,如果它还没有。
Objective-c:
self.statusItem = [[NSStatusBar systemStatusBar]
statusItemWithLength:NSSquareStatusItemLength];
NSImage *image = [NSImage imageNamed:@"statusItemIcon"];
[image setTemplate:YES];
[self.statusItem setImage:image];
swift:(蔡志伟在下方link的回答)
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
使用Swift 3.0,您可以使用UserDefaults访问macOS外观,或"AppleInterfaceStyle",使用以下代码:
let mode = UserDefaults.standard.string(forKey: "AppleInterfaceStyle")
如果用户启用了深色模式,则默认值为 return 字符串 "Dark"。如果他们启用了 "light mode",它将 return 为零。因此,您需要将其包装在以下代码中:
if UserDefaults.standard.string(forKey: "AppleInterfaceStyle") == "Dark" {
statusItem.image = NSImage(named: "WhiteIcon")
} else {
statusItem.image = NSImage(named: "BlackIcon")
}
我相信可能有更简洁的方法,也许有一个守卫,但这会让你到达 Swift 3.0
中你需要去的地方
编辑:
以上代码将确定用户当前 "mode"。但是,使用简单的用户首选项检查不会导致正确的行为(例如,它只会在应用程序启动时触发)。
正确的执行方法是将菜单图标设置为黑色图标。然后,浏览到资产目录中的资产,然后 select 菜单图标。使用菜单 selected,浏览到属性检查器并确保使用“Mac”设备检查图像。然后选择“渲染为”设置为“模板图像”。
这只需要你有一个黑色图标,macOS 会处理图像从暗模式到亮模式的转换。
我正在 swift 中为 OS X 创建代理应用程序(仅在菜单栏中显示应用程序图标)。我正在使用以下方法从 AppDelegate 加载应用程序的图标:
statusItem.image = NSImage(named: "BlackIcon")
而且效果很好。
但是,如果用户从“系统偏好设置”->“常规”中选择使用深色菜单栏,用户将看不到该图标,因为它是黑色的。
因此,如果用户选择了选项,我需要向他们显示不同的 'WhiteIcon'。
如何检查用户是否在我的应用程序中启用了此选项?
您似乎正在尝试为深色模式反转小菜单图标颜色。默认情况下 OSX 处理暗模式并反转图像颜色,但是您需要专门添加 [image setTemplate:YES] 才能为您工作,如果它还没有。
Objective-c:
self.statusItem = [[NSStatusBar systemStatusBar]
statusItemWithLength:NSSquareStatusItemLength];
NSImage *image = [NSImage imageNamed:@"statusItemIcon"];
[image setTemplate:YES];
[self.statusItem setImage:image];
swift:(蔡志伟在下方link的回答)
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
使用Swift 3.0,您可以使用UserDefaults访问macOS外观,或"AppleInterfaceStyle",使用以下代码:
let mode = UserDefaults.standard.string(forKey: "AppleInterfaceStyle")
如果用户启用了深色模式,则默认值为 return 字符串 "Dark"。如果他们启用了 "light mode",它将 return 为零。因此,您需要将其包装在以下代码中:
if UserDefaults.standard.string(forKey: "AppleInterfaceStyle") == "Dark" {
statusItem.image = NSImage(named: "WhiteIcon")
} else {
statusItem.image = NSImage(named: "BlackIcon")
}
我相信可能有更简洁的方法,也许有一个守卫,但这会让你到达 Swift 3.0
中你需要去的地方编辑:
以上代码将确定用户当前 "mode"。但是,使用简单的用户首选项检查不会导致正确的行为(例如,它只会在应用程序启动时触发)。
正确的执行方法是将菜单图标设置为黑色图标。然后,浏览到资产目录中的资产,然后 select 菜单图标。使用菜单 selected,浏览到属性检查器并确保使用“Mac”设备检查图像。然后选择“渲染为”设置为“模板图像”。
这只需要你有一个黑色图标,macOS 会处理图像从暗模式到亮模式的转换。