NSResponder sembra non avere un doppio clic del mouse. C'è un modo semplice per catturare un doppio clic?Catching doppio clic in Cocoa OSX
risposta
I mouseDown:
e mouseUp:
metodi accettano un oggetto NSEvent come argomento con informazioni sui clic, compresi il clickCount
.
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).
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.
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
@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
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")
}
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);
}
}
- 1. Fare doppio clic su una riga NSTableView in Cocoa?
- 2. Cocoa OSX widget/controlli personalizzati
- 3. Cos'è questo doppio trattino basso in Cocoa
- 4. Doppio clic in R-lucido
- 5. DataGridView elemento doppio clic
- 6. Evidenziazione doppio clic
- 7. Highcharts - Evento doppio clic
- 8. Javafx 2 clic e doppio clic
- 9. Pulisci singolo clic + doppio clic su Silverlight?
- 10. WPF: clic singolo con pulsante + doppio clic
- 11. Intercetta il clic del mouse singolo o doppio - Esegui solo il codice doppio clic sul doppio clic
- 12. Distinguere tra un solo clic e doppio clic in Java
- 13. Disattiva espansione dopo doppio clic
- 14. come ottenere il doppio clic in WPF
- 15. Installazione con doppio clic in Ubuntu?
- 16. Doppio clic in selenio di pitone
- 17. Attuare doppio clic sul pulsante in Android
- 18. doppio clic in una posizione specifica
- 19. jQuery animazione: Ignora doppio clic
- 20. Evento doppio clic su Android
- 21. jQuery .load() Come impedire il doppio caricamento dal doppio clic
- 22. Persone che fanno doppio clic su tutto nelle pagine Web ... jQuery doppio clic problemo
- 23. Il doppio clic sulle intestazioni di NSOutlineView sta attivando il metodo del doppio clic?
- 24. Direzione eventi del mouse [DllImport ("user32.dll")] clic, doppio clic
- 25. Catching FaultException in WebServices
- 26. Catching console.log in node.js?
- 27. Catching "NullPointerExceptions" in JavaScript
- 28. Catching Tabs in TextArea
- 29. Fare doppio clic sulla riga DataGridView?
- 30. Evento doppio clic sul bordo finestra WPF
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