🐰
NSButtonのmouseDown / mouseUpイベントを捕まえる
NSButtonのサブクラスでmouseDown(with:)
/ mouseUp(with:)
各イベントを捕まえようとする際に、次のようなコードを考えると思います。しかしNSButtonの場合はなぜかこれがうまくいきません。
class MyButton: NSButton {
override func mouseDown(with event: NSEvent) {
super.mouseDown(with: event)
print(#function) // ←この時点ですでにmouseUpが起きている
}
override func mouseUp(with event: NSEvent) {
super.mouseUp(with: event)
print(#function)
}
}
二つのログは実際にクリックが完了してから呼ばれるため、マウス左ボタンの「押し込み」と「離し」の各イベントを適切に区別できません。NSButtonではmouseDownの中で少し特殊な実装をしているようです。
そこで、次のようにmouseDownのみでコードを挟むと「押し込み」と「離し」イベントを適切に区別することができます。
class MyButton: NSButton {
override func mouseDown(with event: NSEvent) {
// Mouse down
print(#function, "Mouse down")
super.mouseDown(with: event)
// Mouse up
print(#function, "Mouse up")
}
}
参考:
NSButton mouseDown mouseUp behaving differently on enabled
Discussion