按下时 NSButton 变为灰色

NSButton turns gray when pushed

我有一个带有图像的 NSButton。按下时整个单元格变成灰色。如何防止这种情况? 有几篇关于这个主题的帖子。但他们中的大多数都只有 10 岁。最近的一个在这里:

据此,我尝试使用以下代码:

class overviewImageButton: NSButton {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    convenience init(appearance: NSAppearance) {
        self.init(appearance: appearance)

        self.appearance = NSAppearance(named: NSAppearanceNameAqua)
    }

    override func draw(_ dirtyRect: NSRect) {

        self.image = NSImage(named: "buttonImage.png")

        super.draw(dirtyRect)

        NotificationCenter.default.addObserver(forName: windowChanged, object: nil, queue: nil) {
            notification in
            self.image = NSImage(named: "buttonImage_highlighted.png")
        }
    }
}

但它不起作用。按钮单元在按下时仍会变成灰色。感谢您的帮助!

NSButton 状态外观通常受到 highlightsBy and showsStateBy 的影响。这些方法改变了 NSButtonCell 中发生的事情,我认为你指的是

https://developer.apple.com/documentation/appkit/nsbuttoncell

and 两位都已经说过很多这句话,所以功劳归功于他们。

Willeke 所说的:

从不draw() 中做任何事情,除了画画。这个方法可以在屏幕刷新时被调用。因此,目前您基本上是在尝试将自己添加为 notificationCenter really 的观察者。

您可以执行以下操作: 编写一个 setup() 方法并从每个初始化程序中调用它。它们中的任何一个都为按钮实例调用一次。

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.setupButton()
}

override init(frame frameRect: NSRect) {
    super.init(frame: frameRect)
    self.setupButton()
}

private func setupButton() {
    self.image = NSImage(named: "buttonImage.png")

    NotificationCenter.default.addObserver(forName: .windowChanged, object: nil, queue: nil) {
        notification in
        self.image = NSImage(named: "buttonImage_highlighted.png")
    }
}

您不需要在此处添加 init(frame:) 初始化程序。对于故事板,init(coder:) 一个就足够了。无论如何我都添加了它,因为您可能想以编程方式初始化按钮。您通常在那里使用 init(frame:) 方法。如果您添加便捷方法,请确保也在那里调用 setup() 方法。

我说的是: 重要事项: 我为抑制 mouseDown 的灰色背景所做的是在调用 super.draw(rect).

之前简单地调用 isHighlighted = false
override func draw(_ dirtyRect: NSRect) {
    self.isHighlighted = false

    super.draw(dirtyRect)
}

奖金: 我看到你在某个地方定义了一个 Notification.Name。您可以在 Notification.Name 的项目全局扩展中定义所有这些,如下所示:

extension Notification.Name {
    static let windowChanged = Notification.Name(rawValue: "WindowChangedNotification")
}

之后你可以像系统通知名称一样在任何地方使用它们。