2012-11-02 20 views
6

से UITableView लोड करें मैं UITableView के साथ iMessage बबल टेक्स्ट व्यवहार की नकल करने की कोशिश कर रहा हूं। हमेशा नीचे स्क्रॉल करने के लिए मैं scrollToRowAtIndexPath का उपयोग कर रहा हूं जब viewDidLoad और viewDidAppear। ऐसा इसलिए है क्योंकि जब viewDidLoad विधि कहा जाता है, तो तालिका पूरी तरह से लोड नहीं की गई है, इसलिए मुझे viewDidAppear में उस अतिरिक्त स्क्रॉल की आवश्यकता है। यह कोड चाल बनाता है। हालांकि, मैं जो चाहता हूं वह एनिमेटेड स्क्रॉल नहीं है (animatedNO पर यह हल नहीं करता है), मैं चाहता हूं कि तालिका हमेशा नीचे से प्रदर्शित की जाए, तालिका लोड न करें और फिर अंतिम पंक्ति पर जाएं।नीचे

क्या यह संभव है? मुझे वांछित व्यवहार के साथ पूरी तरह फिट बैठने वाला कोई समाधान नहीं मिल रहा है।

+0

आप एक 180 डिग्री के साथ तालिका दृश्य फ्लिप करने की कोशिश कर सकते, फ्लिप अपने कस्टम टेबल सेल 180 डिग्री सेल्सियस देखते हैं ताकि वे सामान्य दिखें और इंडेक्स पथों के लिए अपने तर्क को घुमाएं। आपके टेबलव्यू के नीचे पंक्ति 0 होगी। – Moxy

+0

यह एक बहुत काम की तरह लगता है। बस अपने ऑब्जेक्ट्स को पहली ऑब्जेक्ट के लिए अंतिम ऑब्जेक्ट को स्विच करना और इसी तरह से चालू करें। फिर आप इसे उलट क्रम में प्रदर्शित करेंगे। – Martol1ni

+0

@ मार्टोल 1ni यह कोड की केवल 2 पंक्तियां है! – Moxy

उत्तर

8

आप viewDidLoad से कॉल से बच सकते हैं क्योंकि viewDidAppear के भीतर से स्क्रॉल करता है कि पहली कॉल अनावश्यक। प्रत्येक बार जब आप दृश्य पर नेविगेट करते हैं तो viewDidAppear को कॉल किया जाता है लेकिन देखेंडिडलोड केवल तभी बुलाया जाता है जब दृश्य प्रारंभ होता है।

मैं UITableView डेटा लोड करने के तरीके को बदलने के बजाय उपयोगकर्ता से स्क्रॉल को छिपाने के पहले सुझावों से सहमत हूं। मेरा सुझाव scrollToRowAtIndexPath विधि को VisualWillAppear विधि में एनीमेशन सेट के साथ उपयोग करना होगा। उसके बाद यदि तालिका में उपयोगकर्ता को दिखाई देने पर आपको एक नई पंक्ति जोड़नी है, तो insertRowsAtIndexPaths का उपयोग करें: RowAnimation: तालिका दृश्य के नीचे एक पंक्ति जोड़ने के लिए। अपने डेटा मॉडल के अंत में डेटा जोड़ने का ध्यान रखना सुनिश्चित करें ताकि जब उपयोगकर्ता दूर जाकर वापस आ जाए, तो वह उसी लेआउट पर वापस आ जाता है।

उम्मीद है कि इससे मदद मिलती है।

संपादित करें: बस पिछले जवाब को स्वीकार नहीं कर के लिए अपने कारण को देखा और सोचा कि मैं थोड़ा और अधिक विस्तृत था। मेरे द्वारा प्रस्तावित समाधान के लिए न्यूनतम प्रयास की आवश्यकता होगी, पुनः लोड करने से बचने के लिए डेटा बार-बार और फिर इस प्रकार स्क्रॉल ToRowAtIndexPath विधि को बार-बार कॉल करने से बचें। आपको केवल दृश्य दृश्य में स्क्रॉल करने के लिए एक कॉल करने की आवश्यकता है। तालिका दृश्य के नीचे स्क्रॉल करने के लिए WillAppear (ऐसा करने पर उपयोगकर्ता से संक्रमण छिपाना) और आपको इसे फिर से करने की आवश्यकता नहीं होगी।

+0

मैं इस जवाब को स्वीकार कर रहा हूं क्योंकि @ न्यूमान तारिक यह इंगित करने वाले पहले व्यक्ति थे कि रीफ्रेश को 'व्यूविल्लएपियर' में किया जाना चाहिए। – amb

+0

लेकिन स्क्रॉल करने से पहले हमें reloadData विधि डालने की आवश्यकता है जो एनीमेशन ब्लिंक प्रभाव प्रकट होता है। स्क्रीन में आने के लिए पहली बार कैसे हल करें और सरणी और लोड तालिका में डेटा जोड़ें और बिना किसी झपकी प्रभाव के नीचे नीचे स्क्रॉल करें। –

1

आप viewDidLoad पर अपने UITableView छिपा सकते हैं, और उसके बाद तालिका को नीचे स्क्रॉल करने के बाद इसे viewDidAppear पर दृश्यमान में बदल सकते हैं। इस तरह उपयोगकर्ता स्क्रॉलिंग एनीमेशन नहीं देख पाएगा।

0
scrollToRowAtIndexPath 

उपयोग विशेष स्थिति

1

को tableview में पंक्ति स्क्रॉल करने के लिए आप एक अदृश्य पाद लेख बनाकर इसे ठीक करने और वहाँ में गणना कर सकते हैं। जब पाद लेख सामग्री लोड किया जाता है तो आकार अपडेट किया जाता है। इसे स्क्रॉल करने के लिए मैं टेबलव्यू की सामग्री सेट अप सेट करने की जांच करता हूं।

मैं एनीमेशन हिस्सा बाहर टिप्पणी की है, जब से तुम इसके बिना चाहता था, लेकिन यह भी काम करता है।

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section 
{ 
    return 1; 
} 

-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section 
{ 
    if(tableView.contentOffset.y != tableView.contentSize.height - tableView.frame.size.height && automaticScroll){ 

     //[UIView animateWithDuration:0.0 animations:^{ 

      self.contentTableView.contentOffset = CGPointMake(0, tableView.contentSize.height - self.contentTableView.frame.size.height); 

     //} completion:^(BOOL finished) { 

      [tableView reloadData]; 

     //}]; 

     automaticScroll = NO; 
    } 

    UIView *emptyFooter = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 1)]; 
    emptyFooter.backgroundColor = [UIColor clearColor]; 
    return emptyFooter; 
} 

मैंने स्क्रॉल को नीचे ट्रिगर करने के लिए एक BOOL स्वचालित स्क्रॉल बनाया है। इसे viewWillAppear विधि में सेट किया जाना चाहिए, या जब भी आप डेटा लोड करते हैं और तालिका दृश्य पुनः लोड करते हैं।

आप पंक्तियों को जोड़ना चाहते हैं, तो आप भी, BOOL स्थापित करने के लिए की तरह की जरूरत है:

-(void)addItemButtonClicked:(id)sender 
{ 
    automaticScroll = YES; 
    //Add object to data 
    [self.contentTableView reloadData]; 
} 

आप और अधिक मदद की जरूरत है, तो कृपया मुझे बताएं।

4

मैं कुछ आरपीएन कैलक्यूलेटर में ऐसा कुछ करता हूं जो मैंने बनाया है।मेरे पास सभी संख्याओं के साथ एक टेबल व्यू है और जब स्टैक में कोई संख्या जोड़ा जाता है, तो सबकुछ एक सेल को पॉप करता है। जब मैं दृश्य लोड करता हूं तो मैं कॉल करता हूं:

[self.myTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:NumOfStackItems - 1 inSection:0] 
         atScrollPosition:UITableViewScrollPositionTop animated:NO]; 

मेरे विचार में WillAppear। इस तरह मेरा टेबल दृश्य स्टैक के नीचे दिखाया गया है और कोई एनीमेशन नहीं देखा जाता है। इसे व्यूविल्लियर में डालकर, हर बार जब मैं दृश्य पर नेविगेट करता हूं, तो यह तालिका के नीचे दिखाई देता है।

जब मैं ढेर करने के लिए संख्याओं को जोड़ने, मैं सिर्फ यह एक सरणी है कि सभी नंबरों को धारण में जोड़ने और फिर इस तरह उचित पंक्ति में पाठ डाल:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Cell initialization here... 
    NSUInteger row_num = [indexPath row]; 
    cell.rowNumber.text = [NSString stringWithFormat:@"%g", [DataArray objectAtIndex:NumberOfStackItems-row_num-1];// subtract the row number off to get the correct array index 
    return cell 
} 

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

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self goToBottom]; 
} 

-(void)goToBottom 
{ 
    NSIndexPath *lastIndexPath = [self lastIndexPath]; 
    [self.tableView scrollToRowAtIndexPath:lastIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO]; 
} 

-(NSIndexPath *)lastIndexPath 
{ 
    NSInteger lastSectionIndex = MAX(0, [self.tableView numberOfSections] - 1); 
    NSInteger lastRowIndex = MAX(0, [self.tableView numberOfRowsInSection:lastSectionIndex] - 1); 
    return [NSIndexPath indexPathForRow:lastRowIndex inSection:lastSectionIndex]; 
} 

viewWillAppear पर इस प्रदर्शन उपयोगकर्ता से पहले तालिका देखता है यह किया जाएगा द्वारा:

2

समाधान viewWillAppear ओवरराइड और यह स्क्रॉल (गैर-एनिमेटेड) जाने नीचे करने के लिए है।

17

यह सबसे अच्छा समाधान है!

बस सबकुछ उलट दें!

tableView.transform = CGAffineTransformMakeRotation(-M_PI); 
cell.transform = CGAffineTransformMakeRotation(M_PI); 

स्विफ्ट 4.0:

tableView.transform = CGAffineTransform(rotationAngle: -CGFloat.pi) 
cell.transform = CGAffineTransform(rotationAngle: CGFloat.pi) 

, हालांकि सावधान रहो, क्योंकि अब headerView और footerView पदों के साथ-उलट कर रहे हैं।

+3

यह अब तक का सबसे अच्छा जवाब है! और एफ ** आईएनजी आसान है! – Quetool

+0

स्क्रॉल सूचक को तोड़ता है, लेकिन यह काम करता है :) – RolandasR

+1

यह एक हैकी समाधान है और यदि आपको किसी भी प्रकार के स्वाइप जेश्चर/क्रियाओं को कोशिकाओं में जोड़ने की आवश्यकता है तो सड़क के नीचे समस्याएं पैदा होंगी। –

0

यदि ऊंचाई दृश्य से कम है तो तालिका दृश्य के सामग्री दृश्य को स्थानांतरित करने के लिए लोड डेटा के बाद सामग्री इन्सेट को बदलें।

[self.tableView reloadData];   
[self.tableView setContentInset:UIEdgeInsetsMake(self.view.frame.size.height - self.tableView.contentSize.height < 0 ? 0 : self.view.frame.size.height - self.tableView.contentSize.height, 0, 0, 0)]; 
-1

स्विफ्ट 3,0

// Rotate 
let rotate = CGAffineTransform(rotationAngle: -(CGFloat)(M_PI)) 

// Move to the left 
let translate = CGAffineTransform(scaleX: -1, y: 1) 

self.tableView.transform = rotate.concatenating(translate) 
0

स्विफ्ट 3,1

tableView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi)) 
cell.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi)) 

क्रेडिट: @Christos Hadjikyriacou

+1

पर स्क्रॉल सूचक रखने के लिए यह बेहतर है कि 'cell.contentView.transform = CGAffineTransform (rotationAngle: CGFloat (Double.pi)) '' – douarbou