2017-06-23 9 views
0

NSButtonに画像があります。押すと全体のセルがグレーに変わります。これを防ぐ方法は? このトピックに関する記事がいくつかあります。しかし、彼らのほとんどは10歳のようです。最新のものはここにあった:NSButton background transparent after getting focusNSButtonがプッシュされると灰色に変わります

これによると、私はこのコードを試してみました:

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

[画像ボタンを初期化する方法は?](https://stackoverflow.com/questions/44728599/how-to-initialize-an-image-button) – Willeke

+0

いいえ、可能ではありません重複する。この問題は解決されました。これは新しいトピックです。 –

+0

答えは同じです。 '描画 'だけを描画します。 'init'でプロパティを設定します。 – Willeke

答えて

3

これの多くは、すでにWillekeI'L'I両方で言われたので、信用はそれらに行きます。

はWillekeは言った:

描画以外draw()で何かを決して。このメソッドは、画面のリフレッシュと同じくらい頻繁に呼び出されることがあります。そこで現在、あなたは基本的に通知センターのオブザーバーとして自分自身を追加しようとしています 実際にはです。

あなたができることは次のとおりです。 setup()メソッドを書き、それを各イニシャライザから呼び出します。それらのいずれか1つはボタンインスタンスのために一度呼び出されます。

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()メソッドも呼び出してください。 を重要なものへ:I'L'Iが言っ

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

あなたはシステム通知の名前のようにどこにでもそれらを使用することができた後。

+0

ただ素晴らしいです。どうもありがとう! –

1

NSButton状態の外観は、一般にhighlightsByshowsStateByの影響を受けます。これらのメソッドは、NSButtonCell内で何が起こるかを変更します。

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

+0

まだ動作していませんが、ありがとうございます。 –

+0

「まだ動作していません」は、精神的能力を持つ人にのみ適切ですので、どのように使用しているかを示してください。 –

+0

コードを更新しました。これは現在の状態です。 –

関連する問題