按下

时间:2017-06-23 20:53:45

标签: swift cocoa colors nsbutton appearance

我有一张带图像的NSButton。推动时,整个细胞变灰。怎么预防这个? 有几个关于这个主题的帖子。但他们中的大多数都像10岁。最近的一个是:NSButton background transparent after getting focus

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

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

但它不起作用。按钮在按下时仍然变为灰色。谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

WillekeI'L'I已经说过很多这样的事情,所以很有信心。

Willeke说:

从不draw()中执行任何操作,但绘图除外。可以在屏幕刷新时调用此方法。因此,目前您基本上是在尝试将自己添加为notificationCenter 的观察者,而且经常是

以下是您可以做的事情: 编写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上抑制灰色背景的做法是在调用isHighlighted = false之前简单地调用super.draw(rect)

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

之后,您可以在任何地方使用它们,如系统通知名称。

答案 1 :(得分:1)

NSButton州的出现通常会受到highlightsByshowsStateBy的影响。这些方法改变了NSButtonCell中发生的事情,我认为你正在引用它。

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