我有一张带图像的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")
}
}
}
但它不起作用。按钮在按下时仍然变为灰色。谢谢你的帮助!
答案 0 :(得分:3)
Willeke和I'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
州的出现通常会受到highlightsBy
和showsStateBy
的影响。这些方法改变了NSButtonCell
中发生的事情,我认为你正在引用它。
↳https://developer.apple.com/documentation/appkit/nsbuttoncell