7

के साथ समस्याएं मैं नए आईओएस Google मानचित्र एप्लिकेशन के स्लाइड अप मेनू के व्यवहार को पुन: पेश करने की कोशिश कर रहा हूं।नए Google मानचित्र आईओएस ऐप के समान एक स्लाइड अप व्यू बनाना, एकाधिक UIPanGestureRecognizer

तो मूल रूप से यह एक दृश्य है कि आप एक निश्चित बिंदु तक पैनिंग के साथ स्लाइड कर सकते हैं या किसी निश्चित बिंदु पर स्लाइड कर सकते हैं। यह दृश्य दाईं ओर और बाईं ओर स्लाइडिंग स्क्रॉल दृश्य की तरह स्लाइडिंग के साथ भी हो सकता है।

इसे या तो ऊपर और नीचे स्क्रॉल करना चाहिए या दोनों तरफ स्लाइड करना चाहिए, लेकिन दोनों एक ही समय में नहीं।

बहुत सारे शोध और परीक्षण के बाद मेरे पास कुछ ऐसा है जो काफी करीब काम नहीं कर रहा है।

मेरा कार्यान्वयन 320x400 के फ्रेम के साथ एक UIScrollView है और अंकन स्क्रॉलिंग के साथ 960x400 की सामग्री दृश्य है। फिर मैं एक UIPanGestureRecognizer जोड़ता हूं जो पूरे दृश्य की स्लाइड को संभालता है।

यहाँ PanRecognizer की handleTouch IBAction है:

- (IBAction)handlePan:(UIPanGestureRecognizer *)sender { 
NSLog(@"Panning"); 
    CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self.view]; 

    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) { 
     _firstX = [[sender view] center].x; 
     _firstY = [[sender view] center].y; 
    } 
    if (!IS_IPHONE_5) { 
     if (_firstY < 216) 
      translatedPoint = CGPointMake(_firstX, 216); 
     else 
      translatedPoint = CGPointMake(_firstX, _firstY+translatedPoint.y); 
    } 
    else { 
     if (_firstY < 307) 
      translatedPoint = CGPointMake(_firstX, 307); 
     else 
      translatedPoint = CGPointMake(_firstX, _firstY+translatedPoint.y); 
    } 
    [[sender view] setCenter:translatedPoint]; 
    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) { 
     CGFloat velocityY = (0.2*[(UIPanGestureRecognizer*)sender velocityInView:self.view].y); 

     CGFloat finalX = _firstX; 
     CGFloat finalY = translatedPoint.y + velocityY; 
     if(finalY < _firstY) { 
      if (IS_IPHONE_5) 
       finalY = 307; 
      else 
       finalY = 216; 
     } 
     else if(finalY > _firstY) { 

      if (IS_IPHONE_5) 
       finalY = 605; 
      else 
       finalY = 515; 
     } 

     CGFloat animationDuration = (ABS(velocityY)*.0002)+.2; 
     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDuration:animationDuration]; 
     [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
     [UIView setAnimationDelegate:self]; 
     [UIView setAnimationDidStopSelector:@selector(animationDidFinish)]; 
     [[sender view] setCenter:CGPointMake(finalX, finalY)]; 
     [UIView commitAnimations]; 
    }} 

तो मूल रूप से करता है, तो पैन पक्षों के लिए ऊपर और नहीं देखने के लिए स्लाइड। इस हैंडलपैन विधि के साथ मेरी समस्या यह है कि मैं इसे काम नहीं कर सकता ताकि यह किसी बिंदु से अधिक स्क्रॉलिंग की अनुमति न दे। यह कौन सा है कि मैं क्या साथ क्या करने की कोशिश कर रहा हूँ:

if (_firstY < 216) 
      translatedPoint = CGPointMake(_firstX, 216); 
     else 
      translatedPoint = CGPointMake(_firstX, _firstY+translatedPoint.y); 

सबसे बड़ी समस्या यह सोचा कि UIScrollView पैन इशारा पहचानकर्ता एक मैं जोड़ा से एक ही समय में पैन से निपटने जाता है। जिसका मतलब है कि UIScrollView को एक ही समय में स्लाइड किया गया है और यदि मैं अपनी उंगली के साथ दृश्य को स्लाइड करके भी स्लाइड को स्लाइड करता हूं।

वही हो रहा है यदि मैं केवल पक्षों को स्लाइड करने की कोशिश करता हूं और दृश्य को 1 पिक्सेल ऊपर ले जाता हूं, तो मेरा पैन पहचानकर्ता समाप्त होता है और दृश्य को पूरी तरह से स्लाइड करता है।

मुझे मिला है कि कामकाज मेरे पैन पहचानकर्ता को सेट करने के लिए UIScrollview पैन पहचानकर्ता को काम करने में विफल होने की आवश्यकता है।

[_panGestureRecognizer requireGestureRecognizerToFail: _slideUpScrollView.panGestureRecognizer]; 

तो अब जब मैं पक्षों को स्लाइड करता हूं तो यह काम करता है और दृश्य को ऊपर नहीं ले जाता है। समस्या यह सोचती है कि यह केवल तभी विफल होता है जब आप अपनी उंगली हटाते हैं और दृश्य पक्षों तक स्क्रॉल नहीं करता है। क्या होता है कि आप अब दृश्य को पैन नहीं कर सकते हैं, लेकिन यदि आप इसके अंदर फ्लिक कर देते हैं तो यह "UIGestureRecognizerStateEnded" चला जाता है और दृश्य को स्लाइड करता है।

मैं UIPanGestureRecognizer विषयों को देखा और, सहित मेरी पैन पहचानकर्ता उपवर्गीकरण यह केवल पहचान पक्ष के उन लोगों के पैन और नहीं स्लाइड बनाने के लिए कुछ विकल्प को देखा।

क्या आप लोग सोचते हैं कि मैं सही रणनीति का उपयोग कर रहा हूं या क्या मुझे इसे किसी अन्य तरीके से देखना चाहिए?

आदर्श समाधान हो सकता है कि जब पक्ष को एक स्लाइड दर्ज की गई है, यह केवल क्षैतिज सामग्री ले जाता है और UIScrollView द्वारा और है कि जब एक क्षैतिज पैन दर्ज की गई है, यह केवल पैन खड़ी है और मेरी panreconizer द्वारा नियंत्रित किया जाता संभाल है। सफारी के क्षैतिज और ऊर्ध्वाधर स्क्रॉलिंग के साथ वही व्यवहार है। हालांकि मुझे यह नहीं पता था कि इसे कैसे कार्यान्वित किया जाए।

पढ़ने के लिए धन्यवाद, मुझे बताएं कि आप क्या सोचते हैं। यह बहुत अच्छा होगा अगर कई ऐप्स में Google मानचित्र की तरह एक शानदार स्लाइड मेनू था!

संपादित करें: मैं आईओएस 6 को लक्षित कर रहा हूं।

+0

कृपया चर अंतिम, वाई और _ फर्स्टएक्स, वाई को समझाएं। यह मेरे लिए उपयोगी होगा। – arunit21

+0

_firstX, वाई शुरू होने पर प्रारंभिक स्थिति को सहेजना है। फिर इसकी तुलना अंतिम रूप से की जाती है, वाई आवश्यक होने पर स्क्रॉल स्थिति को सेट/रीसेट करने के लिए। – Blackcode

उत्तर

5

ठीक है, मैंने इसे समझ लिया!

मैंने अपने पैन को ऊर्ध्वाधर स्क्रॉलिंग तक ऊपर और नीचे सीमित करने के लिए UIPanGestureRecognizer - Only vertical or horizontal से उदाहरणों का उपयोग किया और क्षैतिज रूप से पैन किए जाने पर इसे विफल कर दिया।

मैंने पैनिंग से दूर या नीचे दृश्य को अवरुद्ध करने के लिए Restricting UIPanGestureRecognizer movement का भी उपयोग किया।

अंत में मैं करने के लिए requiresToFail निरस्त किया गया:

[_slideUpScrollView.panGestureRecognizer requireGestureRecognizerToFail:_panGestureRecognizer]; 

और वहाँ यह काम करता है!

यदि आपके कोई प्रश्न हैं या प्रस्ताव देने के लिए सुधार हैं तो मुझे बताएं!

धन्यवाद!

+5

क्या आप इस बात की कामकाजी प्रतिलिपि (नमूना) पोस्ट कर सकते हैं? – harshitgupta