我的状态栏图像使用以下代码:
let icon = NSImage(imageLiteralResourceName:"flag")
statusBarItem.image = icon
这会导致某些背景颜色/模式出现错误的颜色。图中,白色的应该是黑色的。图像资源是白色/透明的。如果我改变它,我也会遇到同样的问题。所有其他状态栏图像在某些配置上都会变成白色,我的将保持黑色。
我以为 MacOS 会添加效果,使所有状态栏图标本身看起来统一,但显然情况并非如此......
有什么想法可以解决这个问题吗?
谢谢!
macOS 可以做你想做的事。我建议阅读这个苹果文档: https://developer.apple.com/documentation/uikit/appearance_customization/supporting_dark_mode_in_your_interface
如果您不手动提供代码,基本上您有 2 个选择。
选项 1:在 Xcode 中,导航到 assets.xcassets 中的图像资源。在“属性”窗格中的“渲染为...”中指定“模板图像”。这对于我的菜单栏应用程序来说效果很好。
选项 2:在一个图像资源中提供不同版本的图标,macOS 将选择合适的版本。
对我来说这有效:
class AppDelegate: NSObject, NSApplicationDelegate {
let statusItem = NSStatusBar.system.statusItem(withLength:NSStatusItem.squareLength)
// ...
func applicationDidFinishLaunching(_ aNotification: Notification) {
// ...
if let button = statusItem.button {
let image = NSImage(named: NSImage.Name("TrayIcon"))
image?.isTemplate = true
button.image = image
}
// ...
}
// ...
}
我找到了解决办法。我再次意识到 Apple 对 MacOS 开发的支持远不如 iOS。我认为状态栏图标的颜色调整应该是操作系统的任务,但苹果让开发者来做这项工作。无论如何。
解决方案如下:
您必须提供两个版本的图标,一种是黑色,另一种是白色。
当应用程序启动时,您必须检查用户的 MacO 是处于深色模式还是浅色模式。这可以通过以下代码完成:
let mode = UserDefaults.standard.string(forKey: "AppleInterfaceStyle")
if (mode == "Dark"){
let icon = NSImage(imageLiteralResourceName:"flag")
statusBarItem.image = icon
} else {
let icon = NSImage(imageLiteralResourceName:"flagDark")
statusBarItem.image = icon
}
现在还存在一个问题:当用户在应用程序运行时更改模式时,图标颜色不会更新。另外:如果用户使用自动模式(即白天亮,晚上暗),图标颜色也不会切换。
您可以通过收听深色模式设置更改时触发的特定通知来解决该问题:
DistributedNotificationCenter.default.addObserver(self, selector: #selector(updateIcon), name: NSNotification.Name(rawValue: "AppleInterfaceThemeChangedNotification"), object: nil)
@objc func updateIcon(){
print("updateIcon ausgeführt")
let mode = UserDefaults.standard.string(forKey: "AppleInterfaceStyle")
if (mode == "Dark"){
let icon = NSImage(imageLiteralResourceName:"flag")
statusBarItem.image = icon
} else {
let icon = NSImage(imageLiteralResourceName:"flagDark")
statusBarItem.image = icon
}
}
在我的测试中,这在所有场景中都有效。