2

我正在寻找一种方法来消除 NSStatusBarButton 的苍白效果。这是它当前外观的图片:

带有苍白图像的 NSStatusBarButton

它应该是这样的:

带有原始图像的 NSStatusBarButton

在查看了 Apple 的文档后,我找到了解决问题的方法。如果您直接设置按钮的外观(例如 Aqua 或 DarkAqua),则苍白效果消失:

if let button = statusBarItem.button {
    ...
    button.appearance = NSAppearance.current // or aqua / darkAqua
}

但问题是当用户更改界面主题(例如从暗模式到亮模式)时,NSStatusBarButton 不会自动更改其外观:

NSStatusBarButton 不会自动改变外观

我可以监控AppleInterfaceThemeChangedNotification然后更改外观,但这不是一个干净的解决方案,我对此不满意。

有一个优雅的解决方案吗?NSStatusBarButton 中的图像应该简单地显示而不做任何更改(例如苍白)。因为我提供世界上所有的旗帜,所以我只有 png 格式的图像,没有 PDF 图像。

4

2 回答 2

1

不幸的是,由于 vadian 的解决方案对我不起作用,我想在这里展示我的替代解决方案。也许它可以帮助别人。

创建NSStatusItem和自定义NSStatusBarButton

...
if let button = statusBarItem.button {
    ...
    button.appearance = NSAppearance.current // removes the pale effect
}
...

写一个扩展Notification.Name来做出反应AppleInterfaceThemeChangedNotification

extension Notification.Name {
    static let AppleInterfaceThemeChangedNotification = Notification.Name("AppleInterfaceThemeChangedNotification")
}

将观察者添加到新的通知名称:

DistributedNotificationCenter.default.addObserver(self, selector: #selector(interfaceChanged), name: .AppleInterfaceThemeChangedNotification, object: nil)

响应明暗模式之间的变化:

@objc private static func interfaceChanged() {
    // change button.appearance
}

确保button.appearance仅在必要的 macOS 版本可用时才更改:

guard #available(OSX 10.14, *) else {
    return
}

我确信有一个更清洁的解决方案。如果有人有想法,请告诉我。

于 2020-03-09T21:43:19.927 回答
0

写一个扩展NSStatusBarButton和覆盖viewDidChangeEffectiveAppearance

在方法体中显式更改外观

extension NSStatusBarButton { 
    @available(macOS 10.14, *)
    override public func viewDidChangeEffectiveAppearance() {
        print("viewDidChangeEffectiveAppearance")
        self.appearance = .current 
    }
}
于 2020-03-08T20:11:23.747 回答