2010-02-02 14 views

risposta

25

I mouseDown: e mouseUp: metodi accettano un oggetto NSEvent come argomento con informazioni sui clic, compresi il clickCount.

4

Generalmente le applicazioni guardano clickCount == 2 on - [mouseUp:] per determinare un doppio clic.

Un raffinamento è quello di tenere traccia della posizione del clic del mouse sul - [mouseDown:] e vedere che il delta nella posizione del mouse su è piccolo (5 punti o meno sia in x che in y).

+1

IMHO questo è la risposta più utile in quanto risponde anche l'implicito domanda se reagire al secondo mouseDown o al secondo mouseUp. Certo, in certe situazioni potrebbe avere senso deviare dallo standard. Sfortunatamente, Apple non aderisce perfettamente a uno standard (Finder e Mail in su, Calendar on down) ... – fzwo

4

Gli NSEvent s generati per mouseDown: e mouseUp: hanno una proprietà denominata clickCount. Controlla se sono due per determinare se si è verificato un doppio clic.

implementazione del campione:

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

Basta posizionare che nella vostra NSResponder (come un NSView) sottoclasse.

+0

E cosa faresti in genere se devi gestire entrambi: clic singolo e doppio clic. Ovviamente dovrai ignorare il single-click in qualche modo se alla fine risulta essere doppio clic? – jayarjo

+0

@jayarjo - Fuori dalla mia testa, non posso pensare a nessun posto dove l'azione fatta da un singolo clic non dovrebbe essere eseguita se si scopre che era necessario un doppio clic. Nei campi di testo, un singolo clic posiziona il cursore in un punto specifico. Il doppio clic evidenzia l'intera parola. Quindi spostare il cursore sul singolo clic era innocuo. Nei giochi RTS (almeno di Blizzard) un singolo clic seleziona una singola unità mentre il doppio clic seleziona tutte le unità di quel tipo. Se vuoi fare doppio clic per fare qualcosa di completamente diverso da quello che fa un singolo clic, potresti voler ripensare all'intero UX. – ArtOfWarfare

6

Il problema con la semplice soluzione clickCount è che il doppio clic è considerato semplicemente come due singoli clic. Voglio dire, hai ancora il solo clic. E se vuoi reagire in modo diverso a quel singolo clic, hai bisogno di qualcosa oltre al semplice conteggio dei clic. Ecco quello che ho finito con (in 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

Personalmente, posso controllare il doppio click in funzioni mouseUp:

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

    if ([theEvent clickCount] == 2) 
    { 

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

    } 

} 
Problemi correlati