2012-05-23 10 views
12

का उपयोग करते हुए ऑब्जेक्ट को स्थानांतरित करते समय देरी क्यों होती है I UVANGestureRecognizer का उपयोग करके UIView ऑब्जेक्ट को ले जा रहा हूं - मैं अपनी अंगुली को स्क्रीन पर कितना खींचता हूं, जितना मैं दृश्य को उसी दिशा में ले जाता हूं (केवल एक्स - बाएं या दाएं, वाई बदल नहीं रहा है)। यह ठीक काम करता है, लेकिन (बहुत ध्यान देने योग्य) देरी के साथ।UIPanGestureRecognizer

यहाँ विधि है कि UIPanGestureRecognizer घटना संभालती है:

-(void)movePages:(UIPanGestureRecognizer *)sender 
{ 
    if(switchingMode == 1){ 
     if([sender state] == UIGestureRecognizerStateBegan){ 
      fingerStartPosition = [sender locationInView:self.view].x; 
      viewStartPosition = [[viewControllers objectAtIndex:activeViewControllerIndex] view].center; 
     } 
     [[[[viewControllers objectAtIndex:activeViewControllerIndex] view] layer] setPosition:CGPointMake(viewStartPosition.x - (fingerStartPosition - [sender locationInView:self.view].x) , viewStartPosition.y)]; 

    } 
} 

मैं अपने परत का उपयोग दृश्य की स्थिति निर्धारित करने के लिए कोशिश की है, मैं भी फ्रेम की स्थापना की कोशिश की करने के बाद, विभिन्न अवधियों के साथ एनिमेशन का उपयोग कर, लेकिन सब कुछ वही व्यवहार किया। कोई विचार क्यों यह देरी होती है?

+0

क्या आपको कोई समाधान मिला? इसके अलावा – Ixx

उत्तर

35

UILongPressGestureRecognizer का उपयोग करें और minimumPressDuration से 0.0 पर सेट करें। यह तुरंत पहचानता है और आपको अपडेट किए गए स्थान के साथ UIGestureRecognizerStateChanged समेत सभी समान अपडेट मिलते हैं।

+0

यह एक अच्छा कामकाज है! –

+1

सोचा था कि मैं जोड़ूंगा - मुझे फ़ॉर्म पर एक ड्रॉइंग फ़ील्ड के साथ कोई समस्या हो रही थी जब फॉर्म ज़ूम किया गया था (स्केल किया गया) - यदि आप सीधे ड्राइंग करना शुरू करते हैं तो इसके बजाय स्क्रॉल होगा, आपको अपनी अंगुली को जगह के लिए रखना होगा ड्राइंग से पहले दूसरा विभाजित करें। 100% पैमाने पर ऐसा करने से ऐसा नहीं हुआ, यह तुरंत ड्राइंग शुरू कर देगा। UILongPressGestureRecognizer के साथ UIPanGestureRecognizer को प्रतिस्थापित करना एक इलाज किया! – EvilGeniusJamie

+3

आप 'UILongPressGestureRecognizer' की' स्वीकार्य मॉवमेंट 'को 'CGFloat.infinity' पर भी सेट करना चाहते हैं। अन्यथा, एक छोटी दूरी (10pt) खींचने के बाद इशारा खुद को रद्द कर देगा। –

1

जेस्चर रिकॉग्नाइज़र निश्चित नहीं हो सकता है, अगर यह आपकी पिंगर को कुछ पिक्सल ले जाने से पहले पैन इशारा करता है। मुझे सटीक सहनशीलता मूल्य नहीं पता है, लेकिन यही कारण है कि आप देरी महसूस करते हैं।

प्रलेखन:

एक पैनिंग इशारा निरंतर है। यह तब शुरू होता है जब न्यूनतम संख्या में उंगलियों को पैन माना जाने के लिए पर्याप्त स्थानांतरित किया जाता है।

यदि आप तत्काल आंदोलन चाहते हैं, तो आपको शायद touchesMoved: का उपयोग करके अपना खुद का तर्क बनाना होगा।

पहला मान्यता प्राप्त बिंदु को एनिमेट करने के लिए एक और दृष्टिकोण हो सकता है। लेकिन यह देरी को दूर नहीं करता है। उस दृष्टिकोण के लिए आप github पर मेरे JDDroppableView पर एक नज़र डाल सकते हैं।

+0

यह ड्रैगिंग की शुरुआत में देरी नहीं है मेरा मतलब है ... जब यह देरी समाप्त हो जाती है, और ऑब्जेक्ट पहले से चल रहा है, तो यह देरी से आगे बढ़ रहा है। मैं खींचता हूं, ऑब्जेक्ट चलना शुरू होता है, लेकिन यह धीमा है और मुझे तब तक प्रतीक्षा करनी है जब तक ऑब्जेक्ट आवश्यक स्थिति पर न हो जाए – Michael

1

मैंने पाया कि यदि आप नियमित रूप से नियमित स्पर्श का उपयोग करते हैं तो यह तेजी से प्रतिक्रिया दे रहा था, बेगान, मूव एंड एंडेड। मैंने एक UIGestureRecognizer को भी उपclassed, और यह अभी भी पैनिंग इशारा पर अंतराल था। हालांकि UIGestureRecognizer के भीतर छिड़काव समय पर ट्रिगर होगा, राज्य परिवर्तन को अपने राज्य को बदलने के लिए आधे सेकेंड लगेंगे ... यह केवल एक सादे पुराने टच्सबर्ग का उपयोग करने के लिए तेज़ी से लगता है, खासकर यदि आप सीपीयू बहुत कुछ कर रहे हैं।

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 
{ 
    if touches.count == 1 
    { 
     initialTouchLocation = (touches.first?.locationInView(self).x)! 
    } 
} 
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) 
{ 
    if touches.count == 1 
    { 
     let locationInView = touches.first?.locationInView(self) 
     if !thresholdHit 
     { 
      //this is the threshold for x movement in order to trigger the panning... 
      if abs(initialTouchLocation - locationInView!.x) > 1 
      { 
       thresholdHit = true 
      } 
     } 
     else 
     { 
      if (self.frame.width != CGFloat(screenSize)) 
      { 
       let panDelta = initialTouchLocation - locationInView!.x 
      } 
     } 
    } 
} 
+0

सहमत हुए। मेरे मामले में, मैं उस आइटम को हाइलाइट करना चाहता हूं जिसे मैं चारों ओर खींच रहा हूं। इसके लिए अच्छा दिखने के लिए, हाइलाइट तुरंत खींचा जाना चाहिए। ऐसा लगता है कि UIGestureRecognizer सामान उस प्रारंभिक कार्रवाई को लक्ष्य पर भेजने में धीमा है जो मेरे उपयोग के मामले में बिल्कुल उपयोग नहीं है। –

संबंधित मुद्दे