2012-12-10 12 views
7

W mojej aplikacji chcę, aby przewijanie się wydarzyło, tylko z działaniem kółka przewijania z myszy, a nie z gestu dwóch palców na gładziku. Zasadniczo próbuję określić, czy scrollWheelEvent jest generowany z myszy lub gładzika, wewnątrz - (void) scrollWheel: (NSEvent *) theEvent metoda. Z tego, co wiem do tej pory, wydaje się, że nie ma prostego sposobu, aby to osiągnąć.Mac Cocoa: Jak rozróżnić, czy zdarzenie NSScrollWheel pochodzi od myszy czy gładzika?

Próbowałem obejść ustawienie zmiennej boolean na wartość true i false wewnątrz - (void) beginGestureWithEvent: (NSEvent *) zdarzenie; oraz - (void) endGestureWithEvent: (NSEvent *) zdarzenie; Ale to nie jest rozwiązanie, ponieważ metoda scrollWheel: jest wywoływana kilka razy, po wywołaniu metody endGestureWithEvent :.

Oto mój kod:

$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 
     } 
    } 

wiem, że to jest coś, co nie jest standardem, ale to jest mój warunek. Czy ktoś wie, jak to zrobić? Dzięki!

+0

To brzmi jak coś na znacznie niższym poziomie. Co się stanie, jeśli użytkownik przewinie się jednocześnie za pomocą gładzika i myszy? – TheAmateurProgrammer

+0

Witam TheAmateurProgrammer, jak już wspomniałem, pytanie, które napisałem, nie jest czymś, co jest standardowe. Szukam sposobu na wdrożenie tej funkcji i każdy pomysł jest doceniany !. – AProgrammer

Odpowiedz

16

-[NSEvent momentumPhase] jest rozwiązaniem. Tak więc zdarzenia generowane z gładzika pomiędzy zdarzeniami beginGesture i endGesture zwracają wartość inną niż NSEventPhaseNone dla -[NSEvent phase], a zdarzenia gładzika, które są generowane po zdarzeniu endGesture, zwracają wartość inną niż NSEventPhaseNone dla NSEventPhaseNone dla . Kod jest poniżej,

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

Wrong !!! Przewijanie za pomocą myszy Apple Magic zostanie wykryte jako gładzik dzięki temu podejściu. –

+3

To nie jest źle. Powierzchnia śledząca Magic Mouse jest uważana za gładzik w systemie OS X. Należy również wykluczyć punkty wykrzyknika. –

+0

Działa cudownie; dzięki! – zpasternack

8

Możesz użyć [event hasPreciseScrollingDeltas] do rozróżnienia. Został dodany w OS X Lion. Rozróżnia zdarzenia przewijania linii (kółka myszy) i piksela (trackpady, magiczna mysz).

+0

Punkt przewijania nie jest pikselowy. – uchuugaka

+0

Być może jestem persnickety, ale myślę, że ta odpowiedź ma taki sam problem jak @ AProgrammer's. Ponieważ nie robi dokładnie "tego, co mówi na blaszce", może się przedrzeć w przyszłości i dezorientować, aby człowiek mógł zinterpretować. – Charlesism

+0

Występuje literówka w Twojej odpowiedzi: Niepoprawnie: [zdarzenie hasPreciciseScrollingDeltas] Prawidłowe: [zdarzenie hasPreciseScrollingDeltas] –

0

Odpowiedź udzielona przez @AProgrammer może być niedostępna. Ponieważ zdarzenie scrollwheel generowane przez magiczną mysz ma wartości fazowe: rozpoczęte, zmienione i zakończone. Zdarzenie scrollwheel generowane przez potężną mysz ma wartość none dla fazy i momentu. Metoda ta pozwala jedynie odróżnić potężną mysz od magicznej myszy i gładzika.

2

Moja odpowiedź w Swift, ale na logikę Objective C jest taka sama:

override func scrollWheel(with event: NSEvent) { 
    if event.subtype == .mouseEvent { 
    // mouse 
    } else { 
    // trackpad 
    } 
} 
Powiązane problemy