我在 NSTableView 的每一行都有 NSButtons。
按钮图像在 IB 中设置,并且带 Alpha 通道的黑色图标:
窗口设置为暗模式:
window?.appearance = NSAppearance(named: NSAppearanceNameVibrantDark)
并进入正常模式:
window?.appearance = nil
目标是当窗口为白色时按钮应为黑色,当窗口为暗时按钮应为白色,单击时不改变。
在深色模式下,为了实现颜色变化,我在 NSTableCellView 子类中将按钮的图像“template”属性设置为 true:
public override func awakeFromNib() {
if darkMode {
button.image?.isTemplate = true
} else {
button.image?.isTemplate = false
}
}
IB 中的按钮是这样制作的:
这在 macOS 10.12 Sierra 中效果很好:当窗口为白色时,单击黑色按钮不会改变其外观,这是完美的。
但是当窗口变暗时,单击白色按钮会使窗口变黑,这在我的情况下是不可接受的(*)。此外,模板图像在 macOS 10.11 El Capitan 中不起作用。
Ok:
点击了,不行:
再次单击变黑的按钮使其再次变白......
我的问题是:如何强制 NSButton 在单击时不突出显示模板图像?
我认为这是因为“瞬时更改”类型,但使用其他“瞬时”类型不会改变任何内容,而且我也无法将类型设置为“自定义”(IB 拒绝)。
请注意,与 macOS 10.12 相比,这些模板图像在 macOS 10.11 中的行为有所不同。在 Sierra 中无缝运行的设置组合在 El Capitan 中不起作用。这也是我设置赏金的原因:我需要一个适用于两个系统的解决方案。如果没有解决方案并且您知道原因,那么您的解释也将是一个可以接受的答案。
(*) 在 Sierra 上可以使用模板图像工作的解决方法,方法是使用use button.cell?.setCellAttribute(.cellLightsByContents, to: 0)
阻止按钮在单击时明确改变颜色(尽管仍然有短暂的闪烁)。但在 El Capitan 中,该按钮在深色模式下为黑色,因此这不适用。