2010-05-18 19 views
6

है मेरे पास एक UIView है जिसमें यूआईपीएनजेस्टर रिकॉग्नाइज़र संलग्न है, इशारा ठीक काम कर रहा है सिवाय इसके कि शुरुआती बिंदु यह नहीं है कि पैन पहली बार शुरू हुआ था, यह आमतौर पर एक्स और 5 दोनों में 5 से 15 पिक्सेल से बंद होता है। y निर्देशांक। दुर्भाग्य से भिन्नता संगत नहीं है और उस गति से संबंधित प्रतीत होता है जिस पर पैनिंग गति होती है।UIPanGestureRecognizer शुरुआती बिंदु

यह सत्यापित करने के लिए कि स्पर्श सही तरीके से भेजे जा रहे हैं, मैंने एक स्पर्श जोड़ा है और एक सबव्यूव में बीजगन विधि है और इसे सही प्रारंभिक बिंदु प्राप्त होता है लेकिन इशारा इसके प्रारंभ चरण में एक ही बिंदु प्रदान नहीं करता है। मेरे लॉग से कुछ उदाहरण नीचे दिए गए हैं 'लाइन स्टार्ट पॉइंट' इशारा पहचानकर्ता से प्राप्त पहला बिंदु है।

touchesBegan got point 617.000000x505.000000 
Line start point at 630.000000x504.0000001 
touchesBegan got point 403.000000x503.000000 
Line start point at 413.000000x504.000000 
touchesBegan got point 323.000000x562.000000 
Line start point at 341.000000x568.000000 

क्या किसी ने इस मुद्दे को पहले देखा है?

एक पूरी तरह से नए UIGestureRecognizer को लागू करने के साथ इस मुद्दे के आसपास काम करने के तरीके पर कोई विचार?

उत्तर

2

documentation कहता है कि पैन इशारा तब शुरू होता है जब उंगलियों को "पैन माना जाने के लिए पर्याप्त स्थानांतरित किया जाता है।" यह आंदोलन एक ड्रैग से एक प्रेस को अलग करना है, क्योंकि उपयोगकर्ता की उंगली थोड़ी देर तक हिल सकती है, जबकि वे ड्रैग किए बिना प्रेस करने की कोशिश कर रहे हैं।

मुझे लगता है कि यह पहला अंतर बिंदु और ड्रैग के हिस्से के पहले बिंदु के बीच आप देख रहे अंतर में अंतर है।

+0

समस्या तब होती है जब आप अपना खुद का गेस्टू बनाते हैं UIGestureRecognizer को विस्तारित करके पुनः पहचानकर्ता, शुरुआती बिंदु छिद्रों के तरीकों से अलग है। मैंने सेब को एक बग सबमिट किया। –

+0

हम्म, मुझे यकीन नहीं है कि मैं समझता हूं। यदि आप अपना खुद का UIGestureRecognizer लागू कर रहे हैं, तो क्या आप स्पर्श में अपना खुद का प्रारंभिक बिंदु परिभाषित नहीं करेंगे, वैसे भी? – Douglas

+0

@ डगलस - क्या आपको कभी इसका समाधान मिल गया था? –

0

इस के आसपास पहुंचने के लिए आप संकेत बिंदु को रीसेट करने का प्रयास कर सकते हैं जब इशारा पहचानकर्ता शुरू होता है। उदाहरण के लिए, तो जैसे अपनी कार्रवाई विधि से शुरू:

- (void)panGesture:(UIPanGestureRecognizer *)recognizer; 
{ 
    if (recognizer.state == UIGestureRecognizerStateBegan) 
    { 
     CGPoint point = ...; // The view's initial origin. 
     UIView *superview = [recognizer.view superview]; 
     [recognizer setTranslation:point inView:superview]; 
    } 
} 
2

हाँ अंतर क्योंकि इशारा पहचानकर्ता सक्रिय बनने से पहले आंदोलन के एक अनिर्धारित दूरी इंतजार कर रहा है है। आप क्या कर सकते हैं अपने यूआईपीएनजीस्टर रिकॉग्नाइज़र बनाएं और राज्य को UIGestureRecognizerState में स्पर्श करें स्पर्श में छिद्रित ओवरराइड विधि।

नोट: मैंने स्पर्श किए गए स्पर्शों के बजाय touhces हटाया क्योंकि मैं इसे शुरू करना चाहता था जब उपयोगकर्ता स्पर्श करते थे और तुरंत नहीं।

#import "RAUIPanGestureRecognizer.h" 

@implementation RAUIPanGestureRecognizer 


#pragma mark - UIGestureRecognizerSubclass Methods 

- (void)reset 
    { [super reset ]; } 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 
    { [super touchesBegan:touches withEvent:event ]; } 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
    { 
     [self setState:UIGestureRecognizerStateChanged ]; 
     [super touchesMoved:touches withEvent:event ]; 
    } 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
    { [super touchesEnded:touches withEvent:event ]; } 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
    { [super touchesCancelled:touches withEvent:event ]; } 


@end 
+0

द्वारा उपयोग किए जाने वाले इवर में वास्तविक प्रारंभिक बिंदु को स्टोर करने के लिए एक आकर्षण की तरह काम किया जाता है।कक्षा कार्यान्वयन की शुरुआत में #import को न भूलें, हालांकि – SarpErdag

3
CGPoint beg = [panRecognizer locationInView:_scrollView]; 
    CGPoint trans = [panRecognizer translationInView:_scrollView]; 
    CGPoint firstTouch = CGPointSubtract(beg, trans); 

UIGestureRecognizerStateBegan मामले में इस कोड डाल

6

आप के साथ एक इशारे की प्रारंभिक स्पर्श स्थिति का पता लगाने कर सकते हैं:

यहाँ एक कस्टम इशारा पहचानकर्ता करता है इस के लिए कुछ उदाहरण कोड है इशारा पहचानकर्ता की प्रतिनिधि विधि

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
+0

मुझे इस प्रश्न द्वारा वर्णित सटीक समस्या थी, और इससे मुझे इसे सही तरीके से हल करने में मदद मिली (आईएमएचओ)। CGPoint प्रारंभ स्थान = [स्पर्श स्थान इनव्यू: स्वयं]; // प्रतिनिधि विधि के अंदर काम करता है –