禁用 NSButton 突出显示并停止图像在按下时更改

Disable NSButton highlight and stop image from changing when pressed

在我的新 MacOS 应用程序中,我使用带有图像的 NSButton。每当我按住按钮时,当前图像将变为 darker/highlighted,直到我再次松开按钮。我不想要这种行为,但真的不知道如何禁用它。当前按钮设置:

The main answer on this old post 解释了一种通过将按钮类型更改为 MomentaryChange 来实现的方法,但这似乎不再有效。

如果可能的话,我想在故事板本身中禁用它,但如果这不可能,我可以使用代码来实现它。

我通常必须同时设置这两项才能完全停止此行为:

button.setButtonType(.momentaryChange)
button.isBordered = false

希望对您有所帮助。

在摆弄 NSButton 几个小时后,我终于弄明白了如何控制它的按下状态。 NSButton 本身不提供任何方式来控制它,但底层的 NSButtonCell 提供。为按下状态设置图像:

(self.myButton.cell! as! NSButtonCell).alternateImage = NSImage(named: "myImage")

您还可以使用 highlightsBy突出显示表示按下)和 showsStateBy(状态通常与复选按钮一起使用,复选按钮具有 onoff 状态标志)。除了所有预定义状态 NSContentsCellMaskNSPushInCellMaskNSChangeGrayCellMaskNSChangeBackgroundCellMask 您也可以将它们设置为 0 以禁用不同的绘图。 我发现这个 old Github post 更详细地解释了它。

所以要在 pressed/highlighted 时禁用不同的外观:

(self.timerButton.cell! as! NSButtonCell).highlightsBy = NSCell.StyleMask(rawValue: 0)

我还找到了一种禁用突出显示状态本身的方法,这在您有很多按钮时可能很有用。您可以在自定义 NSButton class 或常规扩展中覆盖 draw(_ dirtyRect: NSRect) 函数,以将 -highlighted 标志保持为 false:

extension NSButton {
    override open func draw(_ dirtyRect: NSRect) {
        self.highlight(false)
        super.draw(dirtyRect)
    }
}