2010-02-02 2 views

ответ

25

Методы mouseDown: и mouseUp: принимают объект NSEvent в качестве аргумента с информацией о кликах, включая clickCount.

4

Обычно приложения смотрят на clickCount == 2 on - [mouseUp:], чтобы определить двойной щелчок.

Одно из уточнений заключается в том, чтобы отслеживать местоположение щелчка мышью по значку [mouseDown:] и видеть, что дельта на месте расположения мыши небольшая (5 или менее точек как для x, так и для y).

+1

ИМХО это самый полезный ответ, поскольку она также отвечает неявный вопрос о том, реагировать ли на второе mouseDown или второе mouseUp. Конечно, в определенных ситуациях может иметь смысл отклоняться от стандарта. К сожалению, сами Apple не совсем придерживаются одного стандарта (Finder и Mail on up, Calendar on down) ... – fzwo

4

NSEvent сгенерировано для mouseDown: и mouseUp: имеет свойство под названием clickCount. Проверьте, если это два, чтобы определить, произошел ли двойной щелчок.

Пример реализации:

- (void)mouseDown:(NSEvent *)event { 
    if (event.clickCount == 2) { 
     NSLog(@"Double click!"); 
    } 
} 

Просто поместите, что в вашем NSResponder (например, как NSView) подкласса.

+0

И что бы вы обычно делали, если вам нужно обрабатывать оба - один клик и двойной щелчок. Очевидно, вам придется игнорировать однократный щелчок, если в итоге получается двойным щелчком? – jayarjo

+0

@jayarjo - В верхней части моей головы я не могу думать о месте, где действие, выполняемое одним щелчком, не должно выполняться, если окажется, что необходим двойной щелчок. В текстовых полях один клик помещает ваш курсор в определенное место. Двойной щелчок подчеркивает это целое слово. Поэтому перемещение курсора на один клик было безобидным. В играх RTS (по крайней мере, Blizzard) одним нажатием выбирает один блок, а двойной щелчок выбирает все единицы этого типа. Если вы хотите, чтобы двойной щелчок делал что-то совершенно отличное от того, что делает один клик, вы можете переосмыслить весь свой UX. – ArtOfWarfare

6

Проблема с простым решением 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") 
} 
0

Лично я проверяю двойной щелчок на MouseUp функции:

- (void)mouseUp:(NSEvent *)theEvent 
{ 

    if ([theEvent clickCount] == 2) 
    { 

     CGPoint point = [theEvent locationInWindow]; 
     NSLog(@"Double click on: %f, %f", point.x, point.y); 

    } 

} 
Смежные вопросы