2012-04-01 34 views
2

Ich versuche zu erkennen, wenn eine Maus gedrückt gehalten wird statt geklickt. Dies ist, was ich habe, aber anstelle einer Klickzahl möchte ich in der Lage sein zu erkennen, die Maus gedrückt zu halten.Detect Maus wird gedrückt gehalten

-(void)mouseDown:(NSEvent *)event; 
{ 
    //instead of clickCount I want my if statement to be 
    // if the mouse is being held down. 
    if ([event clickCount] < 1) 
    { 

    } 
    else if ([event clickCount] > 1) 
    { 

    } 
} 
+0

Wird dieses Ereignis nicht ausgelöst, wenn der Benutzer klickt und hält? – millimoose

+0

Zum Zeitpunkt des Ereignisses "mouseDown" kann der Computer in der Zukunft nicht weit genug sehen, um festzustellen, ob der Benutzer die Maustaste gedrückt hält oder nicht. Um Drag-and-Drop zu implementieren, müssen Sie nur herausfinden, was mit dem Ereignis 'mouseDown' gezogen wird. Sie sehen das' mouseUp'-Ereignis wie Kristian umriß und ermitteln auch, wo das Element abgelegt wurde, und behandeln das 'mouseMoved '(oder wie auch immer es genannt wird) Ereignis (das' mouseIsHeldDown' überprüft) um zu sehen, ob etwas gezogen wird. –

+0

Eine andere Option ist es, eine Art verzögerten Rückruf in der 'mouseDown' zu setzen. Wenn die Maustaste losgelassen wird, löschen Sie den Rückruf, und wenn der Rückruf ausgelöst wird, wurde die Maustaste mindestens so lange gedrückt.Dies ähnelt der Funktionsweise der Tastenwiederholung. –

Antwort

3

Vermutlich möchten Sie feststellen, ob die Maus für eine bestimmte Zeit gedrückt gehalten wird. Das ist ziemlich einfach; es erfordert nur einen Timer.

In Ihrem mouseDown: starten Sie einen Timer, der nach dem von Ihnen gewählten Zeitraum ausgelöst wird. Sie müssen dies in einer Ivar bleiben, weil Sie auch, um es in mouseUp:

- (void)mouseDown: (NSEvent *)theEvent { 
    mouseTimer = [NSTimer scheduledTimerWithTimeInterval:mouseHeldDelay 
                target:self 
               selector:@selector(mouseWasHeld:) 
               userInfo:theEvent 
               repeats:NO]; 
} 

In mouseUp:, zerstören den Timer beziehen:

- (void)mouseUp: (NSEvent *)theEvent { 
    [mouseTimer invalidate]; 
    mouseTimer = nil; 
} 

Wenn der Timer Feuer, dann wissen Sie, dass die Maus Button wurde für den angegebenen Zeitraum gedrückt gehalten wird, und Sie können, was Aktion, die Sie mögen:

- (void)mouseWasHeld: (NSTimer *)tim { 
    NSEvent * mouseDownEvent = [tim userInfo]; 
    mouseTimer = nil; 
    // etc. 
} 
+0

Ihr 'mouseUp'-Handler sollte sich auch um alles kümmern, was passiert, wenn der Benutzer etwas anklickt, aber den Knopf nicht gedrückt hält. Gibt es auch eine Garantie, dass der Timer nicht ausgelöst wird, nachdem 'mouseUp:' eingegeben wurde, aber bevor '[mouseTimer invalidate];' aufgerufen wird? –

+0

@Mike: 1) Natürlich; Ich überlasse das dem OP als Übung. 2) Der Timer und die Ereignisbehandlung sind beide in die Run-Schleife eingereihte Eingaben, so dass dies kein Problem darstellen sollte. Ich kann mir keinen Weg vorstellen, diese Garantie anders zu machen. –

+0

Ich bekomme eine EXC_BAD_ACCESS, sobald ich die Maus für den Zeitraum gedrückt habe und mouseWasHeld aufgerufen habe. Es passiert, sobald ich die Maus loslasse, aber nur wenn mouseWasHeld aufgerufen wird. Weißt du, was ich falsch gemacht habe? –

0

Soweit ich das mouseDown- erinnere mich nur ausgelöst, wenn der Benutzer zuerst das Element klickt, nicht, wenn gedrückt gehalten wird.

Die Lösung für Ihr Problem ist es, ein BOOL in Ihrer .h zu definieren, etwa so:

bool mouseIsHeldDown = false; 

Dann in Ihrem mouseDown-:

mouseIsHeldDown = true; 

Und in Ihrem mouseup:

mouseIsHeldDown = false; 

Sie können dann überprüfen, ob mouseIsHeldDown = true irgendwo in Ihrem Code ist.

Hoffe das behebt Ihr Problem!

9

seit OS X 10.6, können Sie NSEvent ‚s pressedMouseButtons Methode von überall:

NSUInteger mouseButtonMask = [NSEvent pressedMouseButtons]; 
BOOL leftMouseButtonDown = (mouseButtonMask & (1 << 0)) != 0; 
BOOL rightMouseButtonDown = (mouseButtonMask & (1 << 1)) != 0; 

Die Methode gibt Indizes der Maustasten zur Zeit unten als Maske. 1 << 0 entspricht der linken Maustaste, 1 << 1 der rechten Maustaste und 1 << n, n> = 2 anderen Maustasten.

Damit ist es nicht notwendig, die mouseDown:, mouseDragged: oder mouseUp: Ereignisse zu fangen.

Verwandte Themen