2010-02-25 5 views
12

मुझे एक साधारण लेकिन कठिन समस्या का सामना करना पड़ रहा है। जो मैं करने की कोशिश कर रहा हूं वह UIScrollView जैसे पृष्ठ पर UITableView बना रहा है लेकिन पेजिंग सक्षम करने से मुझे बहुत मदद नहीं मिलती है क्योंकि मैं पृष्ठ का आकार सेट नहीं कर सकता, इसलिए टेबलव्यू स्क्रॉल अपनी ऊंचाई के ठीक नीचे स्क्रॉल करता है, इसलिए यह पंक्तियों को दिखाता है .. .10 या 11 ... 20 और इसी तरह से। मैं इसके बजाय क्या चाहूंगा कि जब मैं स्क्रॉल (इस प्रकार पेजिंग) को स्क्रॉल करता हूं तो कोई सेल ऊपर या नीचे दिखाई नहीं देता है, बिना दिखाए गए कोशिकाओं की एक निश्चित सीमा के।पेजिंग सक्षम होने पर UITableView पृष्ठ का आकार

धन्यवाद एक बहुत

उत्तर

13

सरल लेकिन कुशल:

- (void)scrollViewDidEndDecelerating:(UITableView *)tableView { 
      int tomove = ((int)tableView.contentOffset.y%(int)tableView.rowHeight); 
      if(tomove < tableView.rowHeight/2) [tableView setContentOffset:CGPointMake(0, tableView.contentOffset.y-tomove) animated:YES]; 
      else [tableView setContentOffset:CGPointMake(0, tableView.contentOffset.y+(tableView.rowHeight-tomove)) animated:YES]; 
    } 

    - (void)scrollViewDidEndDragging:(UITableView *)scrollView willDecelerate:(BOOL)decelerate { 
      if(decelerate) return; 

      [self scrollViewDidEndDecelerating:scrollView]; 
    } 
+0

वास्तव में मेरे लिए काम नहीं करता। इसके अलावा, क्योंकि आप DidEndDecelerating का उपयोग कर रहे हैं, कोड को तब नहीं कहा जाता है जब कोई मंदी नहीं होती है (यानी: यदि तालिका "flicked" नहीं है, लेकिन धीरे से जारी की जाती है) – pixelfreak

+0

तो आपको उसी कोड को जोड़ना चाहिए - (शून्य) scrollViewDidEndDragging :(UIScrollView *) scrollView willDecelerate: (BOOL) को कम करेगा यदि होगा डिस्सेलरेट: (BOOL) decelerate को झूठा – Julien

+0

@ जुलिएन हाँ, मैं दूसरी विधि पेस्ट करना भूल गया। किसी ने इसे एक साल से अधिक समय तक नहीं देखा! Thx – maxcanna

16

अधिक सरल और अधिक कुशल :)

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ 

    if(decelerate) return; 

    [self scrollViewDidEndDecelerating:scrollView]; 
} 


- (void)scrollViewDidEndDecelerating:(UITableView *)tableView { 

    [tableView scrollToRowAtIndexPath:[tableView indexPathForRowAtPoint: CGPointMake(tableView.contentOffset.x, tableView.contentOffset.y+tableView.rowHeight/2)] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
} 
+2

पर छोड़ दिया गया यह समाधान मेरे लिए पूरी तरह से काम करता है, और प्रत्येक स्क्रॉल के लिए काम करता है। दूसरा समाधान इसके परिणामों के साथ थोड़ा असंगत था ... कभी-कभी यह सेल के शीर्ष पर आ जाएगा, दूसरी बार यह नहीं होगा। – codeqi

+0

@codeqi कारण यह कभी-कभी शीर्ष पर कूदता है, क्योंकि आपके पास संग्रहित दृश्य में आपके आइटम के बीच शायद एक स्थान है। उस स्थिति में indexPathForRowAtPoint विधि 0,0 लौटाएगी - जो शीर्ष पर जाती है। ;) – Lirik

4

यह वास्तविक पेजिंग तरह काम करता है:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView 
        withVelocity:(CGPoint)velocity 
       targetContentOffset:(inout CGPoint *)targetContentOffset 
{ 
    int tomove = ((int)targetContentOffset->y % (int)self.tableView.rowHeight); 
    if(tomove < self.tableView.rowHeight/2) 
     targetContentOffset->y -= tomove; 
    else 
     targetContentOffset->y += (self.tableView.rowHeight-tomove); 
} 

और इसेमें बनाएं:

self.tableView.decelerationRate = UIScrollViewDecelerationRateFast; 
+0

यह लगभग पूरी तरह से काम करता है, लेकिन जब आप बहुत ही सभ्य फ्लिप करते हैं (पृष्ठ को आगे बढ़ाने के लिए पर्याप्त फ्लिप नहीं है) पूर्ण स्क्रीन आकार के कोशिकाओं के लिए विफल रहता है। यह आसानी से इसे एनिमेट करने के बजाय सेल को वापस ले जाता है। –

5

k06a's answer के साथ शुरू, मैं यह थोड़ा परिष्कृत तो यह अधिक वास्तविक पृष्ठवार UITableView की तरह काम करता है। व्यवहार में मतभेद पूर्ण स्क्रीन तालिका पंक्तियों के साथ काफी ध्यान देने योग्य हैं। यहां तक ​​कि किसी भी दिशा में एक मिनी-फ़्लिक को तालिका को अगले पृष्ठ पर स्क्रॉल करना चाहिए: मैं पहले वेग की जांच करके ऐसा करता हूं।

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView 
        withVelocity:(CGPoint)velocity 
       targetContentOffset:(inout CGPoint *)targetContentOffset 
{  
    CGFloat rowHeight = tableView.rowHeight; 
    int verticalOffset = ((int)targetContentOffset->y % (int)rowHeight); 
    if (velocity.y < 0) 
    { 
     targetContentOffset->y -= verticalOffset; 
    } 
    else if (velocity.y > 0) 
    { 
     targetContentOffset->y += (rowHeight - verticalOffset); 
    } 
    // No velocity, snap to closest page 
    else 
    { 
     if (verticalOffset < rowHeight/2) 
     { 
      targetContentOffset->y -= verticalOffset; 
     } 
     else 
     { 
      targetContentOffset->y += (rowHeight - verticalOffset); 
     } 
    }  
} 

ध्यान दें कि अतिरिक्त viewDidLoad: में

self.tableView.decelerationRate = UIScrollViewDecelerationRateFast; 

की स्थापना यह असली चीज़ के करीब है, लेकिन काफी नहीं।

मैं code shown here का उपयोग करके तेज गतिशील दरों को सेट करने के साथ झुका रहा हूं लेकिन मुझे यह सही नहीं मिल सका।

3

और स्विफ्ट में ...

func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) { 
    if !decelerate { 
     self.scrollViewDidEndDecelerating(scrollView) 
    } 
} 

func scrollViewDidEndDecelerating(scrollView: UIScrollView) { 
    if let indexPathToScrollTo: NSIndexPath = self.tableView.indexPathForRowAtPoint(CGPointMake(self.tableView.contentOffset.x, self.tableView.contentOffset.y+tableView.rowHeight/2)) { 
     self.tableView.scrollToRowAtIndexPath(indexPathToScrollTo, atScrollPosition: UITableViewScrollPosition.Top, animated: true) 
    } 
}