有没有办法透露Mac OS菜单栏文本颜色是黑色还是白色?

问题描述 投票:0回答:3

我正在使用 Swiftbar 来显示菜单。我的菜单有一个 SF 图像作为可点击项目,我使用调色板格式渲染该图像,而不是让 Swiftbar 文本拾取菜单栏文本颜色。

因此,如果壁纸图像变为较暗的图像,则菜单栏文本变为白色;如果更亮,菜单栏文本将变为白色。但是,因为我的 SF 图像被编码为黑色,这意味着当壁纸更改时它效果不太好。

我想做的是在每次更换壁纸后检查菜单栏文本的颜色,并在为 SF 图像编码调色板颜色时使用该颜色。有没有办法通过命令行发现这个?

(我还没有找到任何可以做到这一点的代码,所以没有什么可以添加到本节)

macos
3个回答
2
投票

没有官方方法来检测菜单栏文本颜色。

如果您提供自定义图像,您可以在渲染图像时检测菜单外观:

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

1
投票

谢谢 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:

0
投票

这个答案稍微扩展了 @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
        }
© www.soinside.com 2019 - 2024. All rights reserved.