【问题标题】:NSButton turns gray when pushedNSButton 按下时变为灰色
【发布时间】:2017-06-23 20:53:44
【问题描述】:

我有一个带有图像的 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")
        }
    }
}

但它不起作用。按下按钮时,纽扣电池仍会变为灰色。感谢您的帮助!

【问题讨论】:

  • 不,这不是Possible duplicate。这个问题解决了。这是一个新话题。
  • 答案是一样的。只画draw。设置init中的属性。
  • 不要在draw中设置图片,也不要调用super两次。按钮的样式和类型是什么?还是您在代码中创建按钮?
  • 什么是optionsButton

标签: swift cocoa colors nsbutton appearance


【解决方案1】:

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 上抑制灰色背景的方法是在调用 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")
}

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

【讨论】:

  • 简直太棒了。非常感谢!
【解决方案2】:

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

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

【讨论】:

  • 展示你是如何使用它的,因为“仍然不工作”只适用于有通灵能力的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多