我有一个仅在 macOS 状态栏中运行的 macOS 应用程序。我将 Info.plist 中的“Application is agent (UIElement)”属性更改为“YES”:
<key>LSUIElement</key>
<true/>
我有一个计时器,它每 5 秒打印一次外观的名称,如下所示:
Timer.scheduledTimer(withTimeInterval: 5, repeats: true) { _ in
let appearance = NSAppearance.currentDrawing()
print(appearance.name)
}
问题
当我在系统设置中切换暗/亮模式时,名称实际上并没有改变。它总是打印应用程序启动时设置的外观名称。
有没有办法听系统外观变化?
目标
我的最终目标实际上是将 an 绘制NSAttributedString
到 an 上NSImage
,并将其NSImage
用作NSStatusItem
按钮的图像。
let image: NSImage = // generate image
statusItem.button?.image = image
对于我使用的属性字符串中的文本UIColor.labelColor
,它应该基于系统外观。但是,它似乎不尊重系统外观的变化。
当我在深色模式下启动应用程序然后切换到浅色模式时:
当我在 Light Mode 下启动应用程序然后切换到 Dark Mode 时:
边注
我将 theNSAttributedString
变成 anNSImage
并且不NSAttributedString
直接在NSStatusItem
按钮上使用的attributedTitle
原因是因为它在状态栏中的位置不正确。