2012-11-26 12 views
16

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

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGSize cellSize = [[[_stepsArray objectAtIndex:indexPath.row]content] sizeWithFont:[UIFont boldSystemFontOfSize:18.0f] constrainedToSize:CGSizeMake(528.0f, CGFLOAT_MAX)lineBreakMode:NSLineBreakByWordWrapping]; 
    return cellSize.height; 
} 

20 पंक्तियां हैं तो, टेबल बहुत ज्यादा हो जाएगा, लेकिन अगर वहाँ केवल 1 पंक्ति है, यह बहुत छोटा हो जाएगा और अन्य सामग्री नीचे 19 पंक्तियों दिखाई नहीं देगा।

उत्तर

22

अगर मैं इसे सही ढंग से समझ, आप प्रत्येक पंक्ति के लिए ऊंचाई को जोड़ने और tableview पर आधारित है कि ऊंचाई को समायोजित करने के लिए सक्षम होना चाहिए: तुरंत बाद [tableView reloadData]

CGFloat tableHeight = 0.0f; 
for (int i = 0; i < [_stepsArray count]; i ++) { 
    tableHeight += [self tableView:self.tableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]; 
} 
self.tableView.frame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y, self.tableView.frame.size.width, tableHeight); 

आप ऐसा कर सकते हैं

+0

मैं कभी नहीं एक [tableView reloadData] कहते हैं। मुझे इसे कहां रखा जाना चाहिए? – abisson

+0

आपके द्वारा _stepsArray सेट अप करने के बाद (जो मुझे लगता है कि आपका डेटा स्रोत है)। –

+1

ऊंचाई नहीं हैForRowAtIndexPath उस के साथ दो बार बुलाया जा रहा है? इसके अलावा ... क्या ऐसा करने का कोई आसान तरीका नहीं है? मुझे लगता है कि मैंने बहुत सारे ऐप्स देखे हैं जहां टेबल की ऊंचाई पंक्तियों की कुल संख्या से आधारित है ..! धन्यवाद! – abisson

4

आप इस तरह की कोशिश कर सकते हैं,

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if([indexPath row] == ((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject]).row){ 
     NSLog(@"%f",your_tableView.contentSize.height); 
    } 
} 

में स्विफ्ट 3.0

func tableView(_ tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    if indexPath.row == tableView.indexPathsForVisibleRows?.last?.row { 
     print("\(tableView.contentSize.height)") 
    } 
} 
6

यहां अधिक सरल समाधान है: आपको sizeToFit को UITableView पर सेट करना है, इसके बाद यह कोशिकाओं के साथ पॉप्युलेट हो गया है। आप xib के माध्यम से delegate और dataSource सेट करते हैं, तो आप इस तरह अपने viewDidLoad विधि, या viewDidAppear में ऐसा कर सकते हैं,:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [yourTableView sizeToFit]; 
} 

लेकिन, यदि आप कोड में कहीं delegate और dataSource जोड़ने के लिए, आप के बाद sizeToFit डाल करने के लिए है यह:

- (void)someMethod 
{ 
    [yourTableView setDelegate:self]; 
    [yourTableView setDataSource:self]; 

    [yourTableView sizeToFit]; 
} 

इसके अलावा, आपको इसे फिर से लोड करने के बाद करना होगा, अगर आप कहीं ऐसा करते हैं।

यह आपकी तालिका को ऊंचाई पर बिल्कुल आकार देगा जो इसकी कोशिकाओं की ऊंचाई का योग है!

+0

यह सही है डेनिसवेल्लू, ** आकार टॉफिट ** पंक्तियों के बीच सफेद जगहों पर नहीं, केवल पंक्ति की सामग्री पर विचार करेगा। – akelec

3

कॉलबैक में

[your_tableview addObserver:self forKeyPath:@"contentSize" options:0 context:NULL]; 

तो तालिका दृश्य पर contentSize संपत्ति के लिए एक पर्यवेक्षक जोड़ें, और फ्रेम आकार को समायोजित तदनुसार

viewDidLoad में कोड की निम्न पंक्ति जोड़ें:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
    { 
     CGRect frame = your_tableview.frame; 
     frame.size = your_tableview.contentSize; 
     your_tableview.frame = frame; 
    } 

आशा है कि यह आपकी मदद करेगा।

0

बस tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; का उपयोग करें जो आपकी समस्या का समाधान करेगा।

0

सेट मेज पर एक ऊंचाई बाधा, एक आउटलेट से कनेक्ट करें, और जोड़ने के अपने दृश्य को नियंत्रक के लिए निम्न:

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 
    tableViewHeightContraint.constant = tableView.contentSize.height 
} 
संबंधित मुद्दे