2012-03-09 18 views
5

में स्क्रॉल की दिशा की जांच करें मैं विधि scrollViewWillBeginDragging विधि को लागू करने का प्रयास कर रहा हूं। जब यह विधि कहलाती है तो मैं जांचता हूं कि उपयोगकर्ता ने स्क्रॉलव्यू के भीतर मौजूद बटनों में से एक चुना है: चयनित। यदि नहीं तो मैं उपयोगकर्ता को सूचित करने के लिए एक यूआईएलर्ट प्रदर्शित करता हूं।UIScrollView

मेरे यहाँ समस्या मैं केवल (दाएं से अगले दृश्य खींच) यदि सही से उपयोगकर्ता स्क्रॉल छोड़ दिया करने के लिए बटन चयनित (NextQuestion) विधि कॉल करना चाहते है। लेकिन अगर वे से बाएं से दाएं से स्क्रॉल कर रहे हैं तो मैं इसे सामान्य के रूप में स्क्रॉल करना चाहता हूं।

वर्तमान में चेकर विधि को कोई फर्क नहीं पड़ता कि उपयोगकर्ता किस दिशा में स्क्रॉल करता है। मैं से दाएं से बाएं से स्क्रॉल करते समय केवल एक विधि कैसे कॉल कर सकता हूं?

यहाँ कैसे मैं वर्तमान में इसे लागू किया गया है:

समाधान 1 के लिए
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    [self NextQuestion:scrollView]; 
} 

-(IBAction)NextQuestion:(id)sender 
{ 
    CGFloat pageWidth = scrollView.frame.size.width; 
    int page = floor((scrollView.contentOffset.x - pageWidth)/pageWidth) + 1; 
    NSInteger npage = 0; 
    CGRect frame = scrollView.frame; 

    // Check to see if the question has been answered. Call method from another class. 
    if([QuestionControl CheckQuestionWasAnswered:page]) 
    { 
     pageNumber++; 

     NSLog(@"Proceed"); 
     if(([loadedQuestionnaire count] - 1) != page) 
     { 
      [self loadScrollViewWithPage:page - 1]; 
      [self loadScrollViewWithPage:page]; 
      [self loadScrollViewWithPage:page + 1]; 
     } 

     // update the scroll view to the appropriate page 
     frame = scrollView.frame; 
     frame.origin.x = (frame.size.width * page) + frame.size.width; 
     frame.origin.y = 0; 
     [self.scrollView scrollRectToVisible:frame animated:YES]; 

    } 

    // If question has not been answered show a UIAlert with instructions. 
    else 
    { 
     UIAlertView *alertNotAnswered = [[UIAlertView alloc] initWithTitle:@"Question Not Answered" 
                   message:@"You must answer this question to continue the questionnaire." 
                   delegate:nil 
                 cancelButtonTitle:@"OK" 
                 otherButtonTitles:nil, nil]; 
     [alertNotAnswered show]; 
    } 
} 

कोड:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    NSLog(@"%f",scrollView.contentOffset.x); 
    if (scrollView.contentOffset.x < lastOffset) // has scrolled left.. 
    { 
     lastOffset = scrollView.contentOffset.x; 
     [self NextQuestion:scrollView]; 
    } 
} 
+0

इस जवाब पर एक नज़र डालें: http://stackoverflow.com/a/4073028/742298 –

उत्तर

0

अपने class.h फ़ाइल में एक CGFloat lastOffset एक member variable के रूप में करें।

फिर इसे viewDidLoad में 0 सेट करें।

फिर जांच में

 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 

    { 
    if (scrollView.contentOffset.x < lastOffset) // has scrolled left.. 
    { 
     lastOffset = scrollView.contentOffset.x; 
     [self NextQuestion:scrollView]; 
    } 

} 
+0

दुर्भाग्य से यह काम नहीं किया। डीबगर इसे अगर कथन छोड़ने के लिए दिखाता है। मैंने ViewDidLoad में lastOffset को 0 पर सेट किया है। और विचार? – HGomez90

+0

NSLog scrollView.contentOffset.x अगर कथन से ठीक पहले ..बाएं स्क्रॉलिंग के लिए यह नकारात्मक होना चाहिए – Shubhank

+0

स्क्रॉलिंग दाएं से बाएं स्क्रॉलव्यू.contentOffset.x को '0.000000' पर दिखाता है। बाएं से दाएं इसे '768.000000' – HGomez90

0

तुम एक अपने वर्ग के एक सदस्य है जो आप की दुकान जब प्रतिनिधि scrollViewDidBeginDragging प्राप्त करता है के रूप में ऑफसेट प्रारंभ कर रख सकते हैं: संदेश। एक बार आपके पास यह मान हो जाने के बाद आप x स्क्रॉल व्यू ऑफ़सेट के मूल्य के साथ तुलना कर सकते हैं और देख सकते हैं कि दृश्य को बाएं या दाएं खींचा गया था या नहीं।

यदि दिशा बदलना मध्य-ड्रैग महत्वपूर्ण है, तो आप viewDidScroll: प्रतिनिधि विधि में अपने तुलनात्मक बिंदु को रीसेट कर सकते हैं। तो एक और पूरा समाधान अंतिम ज्ञात दिशा और आधार ऑफसेट बिंदु दोनों को स्टोर करेगा और हर बार उचित दूरी को खींचने के बाद राज्य को अपडेट करेगा।

- (void) scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    CGFloat distance = lastScrollPoint.x - scrollView.contentOffset.x; 
    NSInteger direction = distance > 0 ? 1 : -1; 
    if (abs(distance) > kReasonableDistance && direction != lastDirection) { 
     lastDirection = direction; 
     lastScrollPoint = scrollView.contentOffset; 
    } 
} 

'उचित दूरी' जो कुछ भी आप बाएँ और दाएँ आसानी से लेकिन के बारे में 10 अंक के लिए पर्याप्त के बारे में होना चाहिए करने के लिए के बीच फ्लिप करने स्क्रॉलिंग दिशा को रोकने के लिए की जरूरत है।

21

scrollViewWillBeginDragging में स्क्रॉल दृश्य अभी तक नहीं ले जाया गया है (या चाल पंजीकृत) और इतने contentOffset 0. द्वारा आईओएस 5 के रूप में आप के बजाय scrollview के panGestureRecognizer में देखने के लिए दिशा और उपयोगकर्ता की स्क्रॉल इशारा की भयावहता निर्धारित करने के लिए कर सकते हैं।

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView.superview]; 

    if(translation.x > 0) 
    { 
     // react to dragging right 
    } else 
    { 
     // react to dragging left 
    } 
} 
+5

** ध्यान दें, अगर संकेत बहुत सूक्ष्म है तो अनुवाद शून्य लौटा सकता है। ** '' 'CGPoint वेग = [scrollView.panGestureRecognizer velocityInView: scrollView.superview] का उपयोग करें; '' ''। – Robert

+0

इसके अलावा, यदि आप एक UIScrollView फ्लिक करते हैं और फिर दृश्य को अभी भी कम करते समय स्पर्श करके रखें, scrollViewWillBeginDragging को x = y = 0. दोनों के साथ अनुवाद और वेग के साथ बुलाया जाएगा तो बेहतर यह मान लें कि '' '{{} '' '' '' 'ड्रैग खींच रहा है' '' ' सुनिश्चित करने के लिए शून्य के अनुवाद/वेग मानों की जांच करें। – Robert