swift 状态栏图像颜色错误

xzlaal3s  于 2022-11-21  发布在  Swift
关注(0)|答案(3)|浏览(157)

我正在使用以下代码作为状态栏图像:

let icon = NSImage(imageLiteralResourceName:"flag")
statusBarItem.image = icon

这会导致某些背景颜色/模式的颜色错误。在图片中,白色应该是黑色的。图像资源是白色/透明的。如果我改变它,我会得到同样的问题。所有其他状态栏图像在某些配置下会变成白色,我的会保持黑色。
我在想MacOS会添加效果,使所有的状态栏图标看起来统一的,但显然不是这样的...
有办法解决吗?

谢谢你!

piwo6bdm

piwo6bdm1#

我找到了一个解决方案。我再次意识到苹果对MacOS开发的支持远不如iOS。我认为状态栏图标的颜色调整应该是操作系统的任务,但苹果让开发者来做这项工作。随便吧。

  • 解决方案如下:*

您必须提供两个版本的图标,一个是黑色,另一个是白色。
当应用启动时,你必须检查用户的MacOs是处于暗模式还是亮模式。这可以通过以下代码来完成:

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
        }
        
        
        
    }

在我的测试中,这在所有情况下都有效。

2uluyalo

2uluyalo2#

MacOs可以做你想做的事情。我建议阅读Apple文档:https://developer.apple.com/documentation/uikit/appearance_customization/supporting_dark_mode_in_your_interface
基本上你有2个选项,如果你不提供代码手动.
选项1.在Xcode中,导航到assets.xcassets中的图像资源。在属性窗格中,在“Render as...”中指定“Template Image”。这在我的菜单栏应用中运行得很好。
选项2.在一个图像资源中提供不同版本的图标,macOs将选择合适的版本。

snz8szmq

snz8szmq3#

对我来说,这是有效的:

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
        }
       // ...
    }

    // ...

}

相关问题