2012-12-10 34 views
7

मेरे आवेदन में, मैं स्क्रॉलिंग करना चाहता हूं, केवल माउस से स्क्रोल व्हील एक्शन के साथ और ट्रैकपैड पर दो अंगुली इशारे से नहीं। असल में, मैं यह निर्धारित करने की कोशिश कर रहा हूं कि क्या स्क्रॉलहेलवेन्ट माउस या ट्रैकपैड से उत्पन्न होता है - अंदर (शून्य) स्क्रॉलहेल: (एनएसईएंड *) theEvent विधि। जो अब तक मुझे पता है, ऐसा लगता है कि इसे पूरा करने के लिए कोई सीधा तरीका नहीं है।मैक कोको: यदि कोई NSScrollWheel ईवेंट माउस या ट्रैकपैड से होता है तो अंतर कैसे करें?

मैंने एक बुलियन वैरिएबल को सही और गलत अंदर स्थापित करने के आसपास एक काम करने की कोशिश की - (शून्य) startGestureWithEvent: (NSEvent *) घटना; और - (शून्य) endGestureWithEvent: (NSEvent *) घटना; लेकिन यह समाधान नहीं है क्योंकि स्क्रोलहेल: अंत के बाद विधि कई बार बुलाया जा रहा है, GestureWithEvent: विधि कहा जाता है।

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

मैं जानता हूँ कि यह कुछ ऐसा है मानक नहीं है, लेकिन यह मेरी जरूरत है:

यहाँ मेरी कोड है। क्या किसी को ऐसा करने का कोई तरीका पता है ?? धन्यवाद!

+0

यह एक बहुत कम स्तर पर कुछ की तरह लगता है। क्या होगा यदि उपयोगकर्ता एक ही समय में ट्रैकपैड और माउस के साथ स्क्रॉल किया गया हो? – TheAmateurProgrammer

+0

नमस्ते TheAmateurProgrammer, जैसा कि मैंने उल्लेख किया है, मैंने जो सवाल पोस्ट किया है वह मानक नहीं है। मैं इस सुविधा को लागू करने का एक तरीका ढूंढ रहा हूं और किसी भी विचार की सराहना की जा रही है! – AProgrammer

उत्तर

16

-[NSEvent momentumPhase] समाधान है। इसलिए, startGesture और endGesture घटनाओं के बीच ट्रैकपैड से उत्पन्न घटनाएं NSEventPhaseNone के अलावा -[NSEvent phase] के लिए एक मान देता है और अंतराल के बाद उत्पन्न होने वाले ट्रैकपैड ईवेंट NSEventPhaseNone के अलावा -[NSEvent momentumPhase] के लिए कोई मान देता है। नीचे दिए गए कोड है,

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

गलत !!! ऐप्पल मैजिक माउस का उपयोग करके स्क्रॉलिंग इस दृष्टिकोण से ट्रैकपैड के रूप में पहचाना जाएगा। –

+3

यह गलत नहीं है। मैजिक माउस की ट्रैकिंग सतह को ओएस एक्स के भीतर एक ट्रैकपैड माना जाता है। इसके अलावा, विस्मयादिबोधक बिंदुओं में भी शामिल हों। –

+0

अद्भुत काम करता है; धन्यवाद! – zpasternack

8

आप [event hasPreciseScrollingDeltas] उपयोग कर सकते हैं अलग करने के लिए। यह ओएस एक्स शेर में जोड़ा गया था। यह लाइन स्क्रॉल (माउस व्हील) और पिक्सेल स्क्रॉल (ट्रैकपैड, जादू माउस) घटनाओं के बीच अंतर करता है।

+0

यह बिंदु स्क्रॉल पिक्सेल नहीं है। – uchuugaka

+0

शायद मैं दृढ़ता से रह रहा हूं लेकिन मुझे लगता है कि इस उत्तर में @ एप्रोग्रामर के समान समस्या है। चूंकि यह ठीक नहीं है "टिन पर यह क्या कहता है", यह भविष्य में तोड़ने और मानव को व्याख्या करने के लिए भ्रमित करने के लिए उत्तरदायी है। – Charlesism

+0

आपके उत्तर में एक टाइपो है: गलत: [घटना है PreciciseScrollingDeltas] सही: [घटना है PreciseScrollingDeltas] –

0

@AProgrammer द्वारा दिए गए उत्तर शायद उपलब्ध नहीं हैं। चूंकि जादू माउस द्वारा उत्पन्न स्क्रोलव्हील घटना के चरण मान हैं: शुरू, बदल गया और समाप्त हो गया। और शक्तिशाली माउस द्वारा उत्पन्न स्क्रोलव्हील घटना में चरण और गति दोनों के लिए कोई भी मूल्य नहीं है। तो विधि केवल शक्तिशाली माउस को जादू माउस और ट्रैकपैड से अलग कर सकती है।

2

स्विफ्ट में मेरा जवाब है, लेकिन उद्देश्य सी तर्क के लिए एक ही है:

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