2010-02-02 16 views

Répondre

25

Les méthodes mouseDown: et mouseUp: prennent un objet NSEvent comme argument avec des informations sur les clics, y compris le clickCount.

4

Généralement les applications regardent clickCount == 2 on - [mouseUp:] pour déterminer un double-clic. Un raffinement est de garder une trace de l'emplacement du clic de la souris sur - [mouseDown:] et de voir que le delta sur l'emplacement de la souris est petit (5 points ou moins à la fois le x et le y).

+1

mon humble avis c'est la réponse la plus utile, car elle répond aussi à l'implicite question de savoir s'il faut réagir à la deuxième mouseDown ou seconde mouseUp. Bien sûr, dans certaines situations, il pourrait être logique de dévier de la norme. Malheureusement, Apple eux-mêmes ne respectent pas tout à fait une norme (Finder et Mail sur, Calendrier sur le bas) ... – fzwo

4

Les NSEvent générés pour mouseDown: et mouseUp: ont une propriété appelée clickCount. Vérifiez s'il y en a deux pour déterminer si un double clic s'est produit.

exemple d'implémentation:

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

placer juste que dans votre NSResponder (comme un NSView) sous-classe.

+0

Et que feriez-vous généralement si vous avez besoin de gérer à la fois - simple clic et double-clic. Évidemment, vous devrez ignorer un seul clic en quelque sorte si à la fin, il se avère être un double-clic? – jayarjo

+0

@jayarjo - Je ne peux penser à aucun endroit où l'action d'un simple clic ne devrait pas être faite s'il s'avérait qu'un double clic était nécessaire. Dans les champs de texte, un simple clic place votre curseur à un endroit spécifique. Un double-clic met en évidence ce mot entier. Donc déplacer le curseur sur le simple clic était inoffensif. Dans les jeux RTS (au moins ceux de Blizzard), un seul clic sélectionne une seule unité tandis qu'un double clic sélectionne toutes les unités de ce type. Si vous voulez que le double clic fasse quelque chose de complètement différent de ce que fait un simple clic, vous pouvez vouloir repenser l'ensemble de votre UX. – ArtOfWarfare

6

Le problème avec la solution simple clickCount est que le double-clic est considéré simplement comme deux clics. Je veux dire que vous obtenez toujours le seul clic. Et si vous voulez réagir différemment à ce simple clic, vous avez besoin de quelque chose en plus du simple comptage des clics. Voici ce que j'ai fini avec (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

Personnellement, je vérifie la double clic en fonctions mouseUp:

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

    if ([theEvent clickCount] == 2) 
    { 

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

    } 

}