按下时 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")
}
之后你可以像系统通知名称一样在任何地方使用它们。
我有一个带有图像的 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
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")
}
之后你可以像系统通知名称一样在任何地方使用它们。