2012-12-10 9 views
7

Nella mia applicazione, voglio che lo scorrimento avvenga, solo con l'azione della rotella di scorrimento da un mouse e non dal gesto di due dita su un trackpad. Fondamentalmente, sto provando a determinare se lo scrollWheelEvent è generato dal mouse o dal trackpad, all'interno - (void) scrollWheel: (NSEvent *) il metodo Event. Da quello che so finora, sembra che non ci sia un modo semplice per raggiungere questo obiettivo.Mac Coco: come distinguere se un evento NSScrollWheel proviene da un mouse o trackpad?

Ho provato a risolvere un problema impostando una variabile booleana su true e false all'interno dell'evento - (void) beginGestureWithEvent: (NSEvent *); e - (void) endGestureWithEvent: (NSEvent *) evento; Ma questa non è una soluzione perché scrollWheel: il metodo viene richiamato più volte, dopo la chiamata a endGestureWithEvent: method.

Ecco il mio codice:

$BOOL fromTrackPad = NO; 

    -(void)beginGestureWithEvent:(NSEvent *)event; 
    { 
     fromTrackPad = YES;  
    } 

    -(void) endGestureWithEvent:(NSEvent *)event; 
    { 
     fromTrackPad = NO;  
    } 

    - (void)scrollWheel:(NSEvent *)theEvent 
    { 
     if(!fromTrackPad) 
     { 
      //then do scrolling 
     } 
     else 
     { 
     //then don't scroll 
     } 
    } 

So che questo è qualcosa che non è standard, ma questo è il mio requisito. Qualcuno sa un modo per farlo ?? Grazie!

+0

Questo suona come qualcosa ad un livello molto più basso. Cosa succede se l'utente scorre con il trackpad e il mouse contemporaneamente? – TheAmateurProgrammer

+0

Ciao TheAmateurProgrammer, come ho detto, la domanda che ho postato non è qualcosa che è standard. Sto cercando un modo per implementare questa funzionalità e qualsiasi idea è apprezzata !. – AProgrammer

risposta

16

-[NSEvent momentumPhase] è la soluzione. Gli eventi generati dal trackpad tra gli eventi beginGesture e endGesture restituiscono un valore diverso dae gli eventi trackpad generati dopo l'evento endGesture restituiscono un valore diverso da . Il codice è sotto,

- (void)scrollWheel:(NSEvent *)theEvent 
    { 
     if(([theEvent momentumPhase] != NSEventPhaseNone) || [theEvent phase] != NSEventPhaseNone)) 
     { 
      //theEvent is from trackpad   
     } 
     else 
     { 
     //theEvent is from mouse 
     } 
    } 
+1

Sbagliato !!! Scorrendo con il mouse Apple Magic verrà rilevato come trackpad con questo approccio. –

+3

Questo non è sbagliato. La superficie di tracciamento del Magic Mouse è considerata un trackpad all'interno di OS X. Inoltre, si inseriscono i punti esclamativi. –

+0

Funziona meravigliosamente; Grazie! – zpasternack

8

È possibile utilizzare [event hasPreciseScrollingDeltas] per differenziare. È stato aggiunto in OS X Lion. Distingue tra gli scroll di riga (rotellina del mouse) e gli scroll di pixel (trackpad, mouse magici).

+0

È il punto di scorrimento non pixel. – uchuugaka

+0

Forse sono perspicace, ma penso che questa risposta abbia lo stesso problema di @ AProgrammer. Dal momento che non fa esattamente "ciò che dice sul barattolo", è probabile che si rompa in futuro e che possa essere interpretato da un umano. – Charlesism

+0

C'è un errore di battitura nella risposta: errato: [evento hasPreciciseScrollingDeltas] corretto: [evento hasPreciseScrollingDeltas] –

0

La risposta fornita da @AProgrammer potrebbe non essere disponibile. Poiché l'evento scrollwheel generato dal mouse magico ha valori di fase di: iniziato, modificato e terminato. E l'evento scrollwheel generato da un potente mouse non ha valore per nessuna fase e momentumphase. Quindi il metodo può solo distinguere il potente mouse dal mouse magico e dal trackpad.

2

La mia risposta a Swift, ma per la logica Objective C è la stessa:

override func scrollWheel(with event: NSEvent) { 
    if event.subtype == .mouseEvent { 
    // mouse 
    } else { 
    // trackpad 
    } 
} 
Problemi correlati