2009-08-31 4 views
18

मेरे पास एक UITableView है जिसका सामग्री गतिशील रूप से बदल रहा है, जैसे फीफो स्टैक। कोशिकाओं को नीचे में जोड़ा जाता है और शीर्ष से हटा दिया जाता है।तालिका में UITableView को स्क्रॉल करने के लिए कैसे करें FooterView

यह खूबसूरती से काम करता है, और मैं इंडेक्सपैथ पर स्क्रॉल कर सकता हूं ताकि नवीनतम संदेश हमेशा नीचे तक स्क्रॉल हो (चैट एप्लिकेशन की तरह)।

अब .. मैं उस तालिका अनुभाग में एक पाद लेख जोड़ना चाहता हूं। इसके बजाय

SrollToRowAtIndexPath

का उपयोग कर के मैं tableFooterView करने के लिए स्क्रॉल करने में सक्षम होना चाहते हैं।

कोई भी विचार मैं कैसे कर सकता हूं इसकी सराहना की जाएगी।

उत्तर

-4

मैंने कोशिश नहीं की है, लेकिन जब आप अंतिम पंक्ति + 1 पर स्क्रॉल करते हैं तो क्या होता है?

एक और विचार हमेशा अंत में एक डमी प्रविष्टि जोड़ना होगा और इसे एक अलग दिखाना होगा ताकि इसे एक पाद लेख के रूप में देखा जा सके। फिर आप हमेशा उस पर स्क्रॉल कर सकते हैं।

+1

में मेरे लिए काम करता आप रेंज त्रुटि के बाहर निकलना :(मुझे यह उल्लेख करना चाहिए था कि मैंने पहले से ही मूल पोस्ट में कोशिश की है। – Kevin

3

के बाद से UITableView UIScrollView का एक उपवर्ग है, तो आप UIScrollView विधि

- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated

बस रेक्ट सेट इतना है कि जब यह दिखाई दे रहा है पाद लेख दिखाई दे रहा है, और आप होगा का उपयोग कर की तरह आप भी करने के लिए स्क्रॉल कर सकते हैं अपने समाधान (आप पाद लेख के रेक्ट या किसी और चीज का उपयोग कर सकते हैं, बस इतना ही समय जब आप हर समय सही व्यवहार प्राप्त करते हैं)।

4

हो सकता है कि कुछ की तरह:

[tableView setContentOffset:CGPointMake(0, tableView.contentSize.height) animated:YES]; 
1

यह करने के लिए सबसे आसान तरीका है अंतिम अनुभाग में अंतिम पंक्ति पर UITableViewScrollPositionTop उपयोग करने के लिए है। यह मेरे लिए बहुत अच्छी तरह से काम करता है ...

[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:LAST_ROW inSection:LAST_SECTION] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

सुनिश्चित करें कि आपके टेबल पाद देखें अच्छी तरह तल पर थोड़े-थोड़े अंतराल किया गया है और यह अच्छी तरह देखने के अंदर एनिमेटेड बैठना चाहिए ...

आशा इस मदद करता है .. ।

0

बहुत अच्छा विचार है, इस के लिए अपने आप को देख रहा था :) यहाँ नमूना कोड है, जो चाल करना होगा है:

[tableView reloadData]; 
NSIndexPath *index = [NSIndexPath indexPathForRow:0 inSection:1]; 
[tableView scrollToRowAtIndexPath:index 
    atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 

आपको अपनी tableView पाद लेख में कम से कम एक सेल है, समस्या यह है कि यह दिखाई देने जा रहा है। परीक्षण करने के लिए समय नहीं था, लेकिन मुझे लगता है कि आप इसे वास्तव में छोटा कर सकते हैं?

साथ ही आप सही सामान numberOfSectionsInTableView (टेबल के लिए कम से कम एक और पाद के लिए), numberOfRowsInSection (कम से कम पाद लेख के लिए एक, अपने पिछले अनुभाग) के अंदर, अपने सेल के अलावा लागू करना चाहिए viewForHeaderInSection (शून्य), heightForHeaderInSection (आप शून्य के रूप में सेट हो सकता है तो), cellForRowAtIndexPath (पाद लेख में अपने सेल के लिए विशेष मामला जोड़ने) ...

पर्याप्त होना चाहिए कि।

25

UITableView को इसके पाद लेख के नीचे स्क्रॉल करने का सबसे अच्छा तरीका सामग्री सामग्री को बस सेट करना है। आप contentSize और वर्तमान bounds

का उपयोग करके नीचे की गणना कर सकते हैं। मैं यह तरीका करता हूं।

CGPoint newContentOffset = CGPointMake(0, [self.instanceOfATableView contentSize].height - self.instanceOfATableView.bounds.size.height); 

[self.instanceOfATableView setContentOffset:newContentOffset animated:YES]; 
+0

जब मैंने देरी को जोड़ा तो मैं इसे केवल काम करने में कामयाब रहा कॉलिंग रीलोडटेबल: [स्वयं प्रदर्शन चयनकर्ता: @ चयनकर्ता (scrollToBottom) के साथ ऑब्जेक्ट: शून्य बाद के बाद: 0.3] – Centurion

0

मैं इस का उपयोग कर रहा:, जबकि मैं पंक्तियों जोड़ रहा

[tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[tableView numberOfRowsInSection:0]-1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

तब मैं:

- (void)scrollToBottom{ 
    [self.myTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[self.fetchedResultsController.fetchedObjects count] -1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

}

13

धन्यवाद यहाँ iphone_developer लिए मैं क्या किया है मैं इसे कॉल कर रहा हूं और मेरी तालिका दृश्य का पाद लेख दृश्य दिख रहा है

+0

यह शीर्ष पर नहीं जाएगा नीचे – khalil

+2

नहीं, [tableView numberOfRowsInSection: 0] -1 आखिरी पंक्ति है, इसलिए स्थिति पर स्क्रॉल करें इस पर टैप करें पंक्ति वास्तव में तालिका को स्क्रॉल करेगा – Bejil

+0

@ बेजी यह मानता है कि आपके पास केवल एक अनुभाग है – Jessedc

27

मैं एक tableView के पाद लेख को देखने के लिए स्क्रॉल करने के लिए इस का उपयोग कर रहा:

[self.tableView scrollRectToVisible:[self.tableView convertRect:self.tableView.tableFooterView.bounds fromView:self.tableView.tableFooterView] animated:YES]; 
+2

सरल और कहीं भी उपयोग करने में आसान! –

+0

+1! यह सही जवाब है, मैंने परीक्षण किए गए हर दूसरे उत्तर को कुछ परिस्थितियों में सही ढंग से काम नहीं किया है। – JohnPayne

+0

सिद्धांत में यह अच्छा है, व्यावहारिक रूप से इसे तालिका दृश्य अपडेट के साथ जंजीर नहीं किया जा सकता है - जैसे तालिका दृश्य एनिमेटिंग करते समय पंक्तियों के आवेषण और हटावट। scrollToIndexPath उस – n13

1

मेरे लिए यह अच्छा काम!

CGRect footerBounds = [addCommentContainer bounds]; 
CGRect footerRectInTable = [tableview convertRect:footerBounds fromView:addCommentContainer]; 
[tableview scrollRectToVisible:footerRectInTable animated:YES]; 
2

मेरा देर उत्तर डेवलपर के लिए है, जो कुंजीपटल दिखाए जाने पर पाद लेख दिखाने की आवश्यकता है। सही समाधान contentInset संपत्ति (जो कीबोर्ड दिखाया गया है के बाद बदला जा सकता है) पर विचार करना है, तो यह सुपर आसान है:

- (void)scrollToFooter { 
    UIEdgeInsets tableInsets = self.tableView.contentInset; 
    CGFloat tableHeight = self.tableView.frame.size.height - tableInsets.bottom - tableInsets.top; 
    CGFloat bottom = CGRectGetMaxY(self.tableView.tableFooterView.frame); 
    CGFloat offset = bottom - tableHeight; 
    if(offset > 0.f) { 
    [self.tableView setContentOffset:CGPointMake(0, offset) animated:YES]; 
    } 
} 

मैं नोटिस होगा, कि मेरे मामले में tableView मेरे अपने ViewController और में से एक के लिए जोड़ा गया कोशिकाओं में UITextField है जो पहले उत्तरदाता बन जाते हैं। कुंजीपटल दिखाए जाने पर शो फ़ूटर को स्थानांतरित करने के लिए आपको कुंजीपटल पंजीकृत करने की आवश्यकता होती है, अधिसूचना दिखाती है और (आईओएस 7 पर) इस विधि को वर्तमान रन लूप के अंत में निष्पादित करती है, इस मामले में coz आईओएस 7 स्वचालित रूप से स्क्रॉल करने के लिए scrollToRowAtIndexPath निष्पादित करता है और पाद लेख नहीं दिखाया जाएगा।

-(void)registerKeyboardNotification { 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardDidShown:) 
               name:UIKeyboardDidShowNotification object:nil]; 
} 

- (void)keyboardDidShown:(id)notification { 
    //move to the end of run loop 
    [self performSelector:@selector(scrollToFooter) withObject:nil afterDelay:.0]; 
} 
11

इतने सारे खराब उत्तरों। :-)

सबसे अच्छा तरीका:

[self.tableView scrollRectToVisible: 
    self.tableView.tableFooterView.frame animated:YES 
]; 
+0

के लिए काम करता है यह मानता है कि 'tableFooterView' हमेशा 'tableView' का प्रत्यक्ष सबव्यूव होगा या यह किसी भी मध्यवर्ती दृश्यों की उत्पत्ति पर बैठता है। हालांकि यह अब काम कर सकता है, इस बात की कोई गारंटी नहीं है कि 'tableView' सबव्यू पदानुक्रम भविष्य में आईओएस संस्करणों में समान रहेगा। – Ned

+0

@ कुमार केएल, यह कस्टम पाद लेख और एकाधिक पाद लेख के साथ काम नहीं कर रहा है। –

0

मेरे लिए यह काम:

- (void)tableViewScrollToBottomAnimated:(BOOL)animated { 
    NSInteger numberOfRows = [self.tableView numberOfRowsInSection:0]; 
    if (numberOfRows) { 
     if (self.tableView.tableFooterView) { 
      [self.tableView scrollRectToVisible: 
      self.tableView.tableFooterView.frame animated:YES 
      ]; 
     } else { 
      [self.tableView scrollToRowAtIndexPath: 
      [NSIndexPath indexPathForRow:numberOfRows-1 inSection:0] 
            atScrollPosition:UITableViewScrollPositionBottom 
              animated:animated 
      ]; 
     } 
    } 
} 
0

यह स्विफ्ट 4

func addRow() { 
    tableView.beginUpdates() 
    tableView.insertRows(at: [IndexPath(row: array.count - 1, section: 0)], with: .automatic) 
    tableView.endUpdates() 

    DispatchQueue.main.async { 
     self.scrollToBottom() 
    } 
} 

func scrollToBottom() { 
    let footerBounds = tableView.tableFooterView?.bounds 
    let footerRectInTable = tableView.convert(footerBounds!, from: tableView.tableFooterView!) 
    tableView.scrollRectToVisible(footerRectInTable, animated: true) 
}