2011-09-20 16 views
9

मैं तारीखों के साथ एक UITableView बनाने की कोशिश कर रहा हूं, मुझे बहुत रोमांचक नहीं होना चाहिए, मुझे पता है। यह वर्तमान तारीख के आसपास शुरू होता है, लेकिन उपयोगकर्ता को (भविष्य) और ऊपर (अतीत) तक स्क्रॉल करने में सक्षम होना चाहिए। इसका परिणाम संभावित रूप से पंक्तियों की अनंत संख्या में होता है। तो इसे बनाने के बारे में क्या तरीका है?शाश्वत स्क्रॉलिंग UITableView

NSIntegerMax रिटर्निंग के रूप में पंक्तियों की संख्या पहले से ही अनुप्रयोग क्रैश हो, लेकिन फिर भी ऐसा नहीं है, तो वह अभी भीस्क्रॉल करने के लिए सक्षम किया जा रहा के लिए खाते में नहीं है। मैं पाठ्यक्रम का आधा रास्ता शुरू कर सकता हूं, लेकिन आखिरकार अधिकतम है।

कोई विचार यह कैसे करना या नकली करना है? क्या मैं किसी भी तरह उपयोगकर्ता को ध्यान में रखे बिना तालिका को अपडेट/पुनः लोड कर सकता हूं, इसलिए मैं कभी भी सीमा में नहीं चलता?

समाधान:
मैं @ Ender के सुझाव के साथ चला गया और कोशिकाओं की एक निश्चित राशि के साथ एक मेज बनाया है। लेकिन जब उपयोगकर्ता फिक्स्ड सेल के किनारों के पास स्क्रॉल करता है, तो इसे फिर से लोड करने की बजाय, जब मैं स्क्रॉलिंग को रोकता हूं तो टेबल को फिर से लोड करने के साथ चला जाता है। बिना किसी रोक के महान दूरी को स्क्रॉल करने वाले उपयोगकर्ता के साथ समायोजित करने के लिए, मैंने पंक्ति गणना को 1000 तक बढ़ा दिया, ROW_CENTER निरंतर 500 को डाल दिया। यह वह तरीका है जो पंक्तियों को अद्यतन करने का ख्याल रखता है।

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    NSArray *visible = [self.tableView indexPathsForVisibleRows]; 
    NSIndexPath *upper = [visible objectAtIndex:0]; 
    NSIndexPath *lower = [visible lastObject]; 

    // adjust the table to compensate for the up- or downward scrolling 
    NSInteger upperDiff = ROW_CENTER - upper.row; 
    NSInteger lowerDiff = lower.row - ROW_CENTER; 

    // the greater difference marks the direction we need to compensate 
    NSInteger magnitude = (lowerDiff > upperDiff) ? lowerDiff : -upperDiff; 

    self.offset += magnitude; 
    CGFloat height = [self tableView:self.tableView heightForRowAtIndexPath:lower]; 
    CGPoint current = self.tableView.contentOffset; 
    current.y -= magnitude * height; 
    [self.tableView setContentOffset:current animated:NO]; 

    NSIndexPath *selection = [self.tableView indexPathForSelectedRow]; 
    [self.tableView reloadData]; 
    if (selection) 
    { 
     // reselect a prior selected cell after the reload. 
     selection = [NSIndexPath indexPathForRow:selection.row - magnitude inSection:selection.section]; 
     [self.tableView selectRowAtIndexPath:selection animated:NO scrollPosition:UITableViewScrollPositionNone]; 
    } 
} 

जादू टूट जाता है जब रोक है, लेकिन तालिका दृश्य bounces संपत्ति विकलांग के साथ के बिना मेज के किनारे करने के लिए एक उपयोगकर्ता स्क्रॉल, इस केवल एक छोटी सी गड़बड़ की तरह लगता है, अभी तक पूरी तरह से स्वीकार्य। हमेशा के रूप में, धन्यवाद StackOverflow!

+0

कृपया नीचे दिए गए मेरे उत्तर में कोड आज़माएं। यह एक साधारण तर्क का उपयोग कर रहा है। –

उत्तर

5

आपको टेबल की एक निश्चित संख्या स्थापित करनी चाहिए और जब उपयोगकर्ता तालिका के अंत के पास स्क्रॉल करता है तो अपने डेटासोर्स को समायोजित करना चाहिए। उदाहरण के लिए, आपके पास 51 तिथियां (आज, 25 भविष्य और 25 अतीत) के साथ एक सरणी है। एप्लिकेशन सीमाओं में से एक के पास एक सेल रेंडर करने के लिए कोशिश करता है, अपने सरणी को पुन: कॉन्फ़िगर और reloadData

+0

सुझाव के लिए धन्यवाद। मैं अब यह कोशिश कर रहा हूं, लेकिन reloadData को कॉल करने से तालिका दृश्य की स्क्रॉल स्थिति (या सामग्री ऑफसेट) समायोजित नहीं होगी, इसलिए यह स्क्रॉलिंग रोकता है। उस पर आपका विचार क्या था? चीयर्स। – epologee

+0

मुझे डर है कि बिना स्टॉल स्क्रॉल किए डेटा को पुनः लोड करने का कोई तरीका नहीं है। हो सकता है कि मैन्युअल रूप से सामग्री को सेट करें ReloadData को कॉल करने के बाद वर्तमान सेल के लिए तालिकादृश्य की ऑफसेट ... – ender

+0

मैंने आपका समाधान उठाया, लेकिन 'scrollViewDidEndDecelerating:' विधि में पुनः लोड करें। इस तरह उपयोगकर्ता द्वारा पुनः लोड नहीं किया जाएगा। एक सराहनीय उच्च संख्या (जैसे 1000) की पंक्ति गणना को बढ़ाने से अधिकांश उपयोग मामलों का ख्याल रखा जाएगा, जो कि किसी भी ग्लिच को नहीं देख रहे हैं। धन्यवाद! – epologee

2

दो विचारों फोन:

  1. तुम सच में एक UITableView की ज़रूरत है? आप , तीन स्क्रीन उच्च का उपयोग कर सकते हैं। यदि स्क्रॉलिंग का अंत तक पहुंच गया है, तो अपनी सामग्री लेआउट करें और स्क्रॉलिंग स्थिति समायोजित करें। यह अनंत स्क्रॉलिंग का भ्रम देता है। कुछ दिनांक लेबल बनाना और उन्हें layoutSubviews: में व्यवस्थित करना बहुत अधिक प्रयास नहीं होना चाहिए।

  2. यदि आप वास्तव में UITableView पर रहना चाहते हैं तो आप दो UITableViews के बारे में सोच सकते हैं। यदि आपके पहले व्यक्ति में स्क्रॉलिंग एक महत्वपूर्ण बिंदु तक पहुंच जाती है, तो थ्रेड को घुमाएं और दूसरे को पॉप्युलेट करें। फिर किसी बिंदु पर, विचारों का आदान-प्रदान करें और स्क्रॉलिंग को मैन्युअल रूप से ट्रिगर करें ताकि उपयोगकर्ता परिवर्तन को नोट न करे। यह मेरे सिर के शीर्ष से सिर्फ कुछ विचार है। मैंने अभी तक इस तरह कुछ लागू नहीं किया है, लेकिन मैंने अनंत UIScrollView लागू किया है।

+0

अच्छे सुझाव। मैं अपने पहले के बारे में सोच रहा हूं, लेकिन मैं सभी सेल पुन: उपयोग के कारण UITableView से चिपकना चाहता था और तथ्य यह है कि ऐसा लगता है कि यह एक टेबल होना चाहिए: एस। मैं UIScrollView को यह देखने के लिए कोशिश करूंगा कि यह कितना अच्छा है। धन्यवाद! – epologee

3

तुम भी WWDC 2011 के "उन्नत स्क्रॉल देखें तकनीक" बात पर एक नज़र वे दिखाया है कि कैसे आप एक UIScrollView जो स्क्रॉल अनिश्चित काल बन जाएगा हो सकता है। यह लगभग 5 मिनट से शुरू होता है। में।

+0

धन्यवाद, अच्छी टिप, मैंने कहीं कहीं buffered किया है। ओह और ट्रज़ल मैन के लिए बहुत धन्यवाद, इसे सालों से इस्तेमाल किया! – epologee

0

मैं एक और पोस्ट में इस सवाल का जवाब: https://stackoverflow.com/a/15305937/2030823

को शामिल करें:

https://github.com/samvermette/SVPullToRefresh

SVPullToRefresh तर्क जब UITableView नीचे तक पहुँच जाता है संभालती है। एक स्पिनर स्वचालित रूप से दिखाया जाता है और एक कॉलबैक ब्लॉक निकाल दिया जाता है। आप कॉलबैक ब्लॉक में अपने व्यावसायिक तर्क में जोड़ते हैं।

#import "UIScrollView+SVInfiniteScrolling.h" 

// ... 

[tableView addInfiniteScrollingWithActionHandler:^{ 
    // append data to data source, insert new cells at the end of table view 
    // call [tableView.infiniteScrollingView stopAnimating] when done 
}]; 
0

यह सवाल पहले से ही कहा गया है: implementing a cyclic UITableView मुझे लगता है कि इस सवाल का जवाब को कॉपी कर रहा हूँ यहाँ क्योंकि प्रश्नकर्ता मेरा उत्तर टिक नहीं किया है यह आसान बनाने के लिए।

UITableView scrollViewDidScroll विधि में UIScrollView के समान है।

तो, अनंत स्क्रॉलिंग अनुकरण करना आसान है।

  1. डबल सरणी ताकि सिर और पूंछ एक साथ शामिल हो गए हैं गोल मेज का अनुकरण करने

  2. दोगुनी मेज और दोगुनी तालिका के 2 भाग जब वे करते हैं के 1 भाग के बीच उपयोगकर्ता स्विच करने के लिए मेरे निम्नलिखित कोड का उपयोग टेबल की शुरुआत या अंत तक पहुंचने के लिए।

:

/* To emulate infinite scrolling... 

The table data was doubled to join the head and tail: (suppose table had 1,2,3,4) 
1 2 3 4|1 2 3 4 (actual data doubled) 
--------------- 
1 2 3 4 5 6 7 8 (visualizing joined table in eight parts) 

When the user scrolls backwards to 1/8th of the joined table, user is actually at the 1/4th of actual data, so we scroll instantly (we take user) to the 5/8th of the joined table where the cells are exactly the same. 

Similarly, when user scrolls to 6/8th of the table, we will scroll back to 2/8th where the cells are same. (I'm using 6/8th when 7/8th sound more logical because 6/8th is good for small tables.) 

In simple words, when user reaches 1/4th of the first half of table, we scroll to 1/4th of the second half, when he reaches 2/4th of the second half of table, we scroll to the 2/4 of first half. This is done simply by subtracting OR adding half the length of the new/joined table. 

Written and posted by Anup Kattel. Feel free to use this code. Please keep these comments if you don't mind. 
*/ 


-(void)scrollViewDidScroll:(UIScrollView *)scrollView_ 
{ 

    CGFloat currentOffsetX = scrollView_.contentOffset.x; 
    CGFloat currentOffSetY = scrollView_.contentOffset.y; 
    CGFloat contentHeight = scrollView_.contentSize.height; 

    if (currentOffSetY < (contentHeight/8.0)) { 
    scrollView_.contentOffset = CGPointMake(currentOffsetX,(currentOffSetY + (contentHeight/2))); 
    } 
    if (currentOffSetY > ((contentHeight * 6)/ 8.0)) { 
     scrollView_.contentOffset = CGPointMake(currentOffsetX,(currentOffSetY - (contentHeight/2))); 
    } 

} 

पी.एस. - मैंने एनटी टाइम टेबल (लाइट) नामक मेरे ऐप्स में से एक पर इस कोड का उपयोग किया है। यदि आप पूर्वावलोकन चाहते हैं, तो आप ऐप देख सकते हैं: https://itunes.apple.com/au/app/nt-time-table-lite/id528213278?mt=8

यदि आपकी तालिका कभी-कभी बहुत कम हो सकती है, तो उपरोक्त विधि की शुरुआत में आप एक तर्क जोड़ सकते हैं जब डेटा गिनती उदाहरण के लिए कहती है 9 से

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