我正在使用 Swiftbar 来显示菜单。我的菜单有一个 SF 图像作为可点击项目,我使用调色板格式渲染该图像,而不是让 Swiftbar 文本拾取菜单栏文本颜色。
因此,如果壁纸图像变为较暗的图像,则菜单栏文本变为白色;如果更亮,菜单栏文本将变为白色。但是,因为我的 SF 图像被编码为黑色,这意味着当壁纸更改时它效果不太好。
我想做的是在每次更换壁纸后检查菜单栏文本的颜色,并在为 SF 图像编码调色板颜色时使用该颜色。有没有办法通过命令行发现这个?
(我还没有找到任何可以做到这一点的代码,所以没有什么可以添加到本节)
没有官方方法来检测菜单栏文本颜色。
如果您提供自定义图像,您可以在渲染图像时检测菜单外观:
let image = NSImage(size: imageSize, flipped: false) { rect in
if NSAppearance.current?.bestMatch(from: [.aqua, .darkAqua]) == .darkAqua {
NSLog("Menu bar is dark")
} else {
NSLog("Menu bar is light")
}
// Draw image...
}
在您的情况下,您可以使用具有深色和浅色变体的动态颜色来定义符号调色板,系统将自动选择正确的颜色。
您可以使用 Xcode 的资源目录来定义动态颜色。 您还可以在代码中定义颜色:
let color = NSColor(name: nil) { (appearance: NSAppearance) in
if appearance.bestMatch(from: [.aqua, .darkAqua]) == .darkAqua {
return NSColor.systemRed
} else {
return NSColor.systemBlue
}
}
谢谢 Darren - 我想我设法用足够快的解决方案解决了这个问题,拍摄了屏幕左上角 Apple 图标的 1*1 像素屏幕截图,然后使用 ImagMagick 评估该图像的 rgba 颜色:
/usr/sbin/screencapture -R25,25,1,1 -t png /tmp/x.png;/opt/homebrew/bin/convert /tmp/x.png sparse-color:
这个答案稍微扩展了 @Darren 的内容,具有更详尽的模式匹配。
let newSize = NSSize(width: 18, height: 18)
let statusIconImage = NSImage(size: newSize, flipped: false) { (dstRect) -> Bool in
// changing image color based on whether status menu bar is in dark or light mode
if let statusBarAppearance: NSAppearance.Name = NSAppearance.currentDrawing().bestMatch(from: [.aqua, .darkAqua, .vibrantDark, .vibrantLight]) {
switch statusBarAppearance {
case .darkAqua, .vibrantDark:
iconImage = iconImage.tint(color: NSColor.white)
case .aqua, .vibrantLight:
iconImage = iconImage.tint(color: NSColor.black)
default:
break
}
} else {
print("Failed to retrieve best matching NSAppearance.Name")
}
iconImage.draw(in: dstRect)
return true
}