🐰

NSButtonのmouseDown / mouseUpイベントを捕まえる

2024/02/23に公開

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
https://stackoverflow.com/questions/22389685/nsbutton-mousedown-mouseup-behaving-differently-on-enabled

Discussion