Ответ 1
Методы mouseDown:
и mouseUp:
принимают объект NSEvent как аргумент с информацией о кликах, включая clickCount
.
NSResponder, похоже, не имеет события двойного щелчка мыши. Есть ли простой способ поймать двойной щелчок?
Методы mouseDown:
и mouseUp:
принимают объект NSEvent как аргумент с информацией о кликах, включая clickCount
.
Проблема с простым решением clickCount
заключается в том, что двойной щелчок рассматривается просто как два клика. Я имею в виду, что вы все равно получаете один клик. И если вы хотите по-другому реагировать на этот единственный клик, вам нужно что-то поверх простого подсчета кликов. Вот что я получил (в Swift):
private var _doubleClickTimer: NSTimer?
// a way to ignore first click when listening for double click
override func mouseDown(theEvent: NSEvent) {
if theEvent.clickCount > 1 {
_doubleClickTimer!.invalidate()
onDoubleClick(theEvent)
} else if theEvent.clickCount == 1 { // can be 0 - if delay was big between down and up
_doubleClickTimer = NSTimer.scheduledTimerWithTimeInterval(
0.3, // NSEvent.doubleClickInterval() - too long
target: self,
selector: "onDoubleClickTimeout:",
userInfo: theEvent,
repeats: false
)
}
}
func onDoubleClickTimeout(timer: NSTimer) {
onClick(timer.userInfo as! NSEvent)
}
func onClick(theEvent: NSEvent) {
println("single")
}
func onDoubleClick(theEvent: NSEvent) {
println("double")
}
Обычно приложения смотрят на clickCount == 2 on - [mouseUp:], чтобы определить двойной щелчок.
Одно из исправлений заключается в том, чтобы отслеживать местоположение щелчка мыши по значку [mouseDown:] и видеть, что дельта на месте расположения мыши небольшая (5 или менее точек как для x, так и для y).
NSEvent
, сгенерированный для mouseDown:
и mouseUp:
, имеет свойство clickCount
. Проверьте, если это два, чтобы определить, произошел ли двойной щелчок.
Пример реализации:
- (void)mouseDown:(NSEvent *)event {
if (event.clickCount == 2) {
NSLog(@"Double click!");
}
}
Просто поместите это в свой подкласс NSResponder
(например, NSView
).
Лично я проверяю двойной клик на функции mouseUp:
- (void)mouseUp:(NSEvent *)theEvent
{
if ([theEvent clickCount] == 2)
{
CGPoint point = [theEvent locationInWindow];
NSLog(@"Double click on: %f, %f", point.x, point.y);
}
}