2009-08-30 11 views
14

मुझे कुछ UITableViewCells मिल गए हैं जिन्हें अंदर की तारों की लंबाई के आधार पर अपनी ऊंचाई बदलने की आवश्यकता है। मैं tableView:cellForRowAtIndexPath: के अंदर आवश्यक ऊंचाई की गणना कर रहा हूं, और उसके बाद इसे एक चर (self.specialRowHeight) में संग्रहीत कर रहा हूं। तब मैं मिल गया है:तालिका प्राप्त करें दृश्य: heightForRowAtIndexPath: तालिका के बाद होने के लिए दृश्य: cellForRowAtIndexPath :?

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.section == SPECIAL_SECTION) { 
     return self.specialRowHeight; 
    } 
    else { 
     return 44; 
    } 
} 

कि सिवाय से पहले tableView:cellForRowAtIndexPath: बिट कहा जाता हो रही किया जा रहा है, तो यह हमेशा शून्य है।

क्या इसके आसपास कोई रास्ता है, या शायद इसे करने का एक अलग तरीका है?

धन्यवाद!

उत्तर

11

गोना यहाँ अपने ही सवाल का जवाब:

मूल रूप से मैं बहुत यकीन है कि ऊंचाई गणना tableView:cellForRowAtIndexPath: विधि से बंधा रहे थे, और कहीं और स्थानांतरित नहीं किया जा सकता था। पुनर्गठन के एक समूह के साथ, हालांकि, मैं उस सामान को वहां से और tableView:heightForRowAtIndexPath: में प्राप्त करने में सक्षम था, जो सबकुछ हल करता है। ,

// Inside tableView:cellForRowAtIndexPath: 
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; 
cell.textLabel.numberOfLines = self.numberOfTextRows; 
// numberOfTextRows is an integer, declared in the class 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    CGSize theSize = [theObject.theStringToDisplay sizeWithFont:[UIFont systemFontOfSize:18.0f] constrainedToSize:CGSizeMake(265.0f, 9999.0f) lineBreakMode:UILineBreakModeWordWrap]; 
    // This gets the size of the rectangle needed to draw a multi-line string 
    self.numberOfTextRows = round(theSize.height/18); 
    // 18 is the size of the font used in the text label 
    // This will give us the number of lines in the multi-line string 

    if ((indexPath.section == FIXED_HEIGHT_SECTION) || (self.numberOfTextRows < 2)) { 
     return 44; 
     // 44 is the default row height; use it for empty or one-line cells (or in other table sections) 
    } else { 
     return theSize.height + 16; 
     // 16 seems to provide a decent space above/below; tweak to taste 
    } 
} 

आप को और सटीकता से उचित सेल ऊंचाई की गणना करने के बारे में सोच सकते हैं:

किसी और को जो ऑटो ऊंचाई समायोजित कोशिकाओं काम करने के लिए प्राप्त करने के लिए कोशिश कर रहा है के लिए, यहाँ कुछ कोड है कि मदद कर सकता है है मैं सुन रहा हु। :)

+0

निम्नलिखित के रूप में कॉल करने के लिए मैं वास्तव में यकीन है कि क्यों नहीं कर रहा हूँ था आप 18 से रेक्ट ऊंचाई को विभाजित करते हैं और फिर इसे फिर से गुणा करते हैं, लेकिन इसके अलावा मैं इसे वही तरीके से करता हूं। –

+0

खैर, पहला विभाजन यह पता लगाने के लिए है कि कितनी पंक्तियों की आवश्यकता है, इसलिए मैं 'cell.textLabel.numberOfLines' सही ढंग से सेट कर सकता हूं; अगर मैं इसे सेट नहीं करता हूं, तो यह सब एक पंक्ति पर मुद्रित हो जाता है। लेकिन हाँ, मुझे लगता है कि मैं 'self.numberOfTextRows' के बजाय, आखिरी बिट में'Size.height' का उपयोग कर सकता हूं। – Triz

+0

स्पष्टता और सरलीकरण के लिए उत्तर संपादित किया गया। वास्तव में वास्तव में अच्छा काम करता है। – Triz

0

आप केवल एक बार self.numberOfLines सेट कर सकते हैं और यह वही काम करेगा। (NumberOfLines 0 पर सेट है, तो लेबल के रूप में कई पंक्तियों का उपयोग करता है के रूप में की जरूरत है।)

+0

उम ... numberOfTextRows एक कस्टम क्लास प्रॉपर्टी है, इसलिए यह जो कुछ भी मैं कहता हूं उसके अलावा यह कुछ भी नहीं करेगा। क्या आप cell.textLabel.numberOfLines के बारे में सोच रहे हैं? – Triz

+0

किसी भी दर पर, हाँ, कोई 'cell.textLabel.numberOfLines' को' 0' पर सेट कर सकता है, लेकिन वास्तविक संख्या का पता लगाने के लिए अभी भी उपयोगी है (उपयुक्त पंक्ति ऊंचाई की गणना करने के लिए, उदाहरण के लिए, यहां) । इसके अलावा मुझे परिणामस्वरूप कोड बहुत स्पष्ट लगता है, क्योंकि "0" एक नज़र में सभी अर्थात् सहायक नहीं है। – Triz

-7

मेरे समाधान tableView:cellForRowAtIndexPath:tableView:heightForRowAtIndexPath: के कार्यान्वयन के अंदर

- (CGFloat)tableView:(UITableView *)aTableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    [self tableView:aTableView cellForRowAtIndexPath:indexPath]; 
    return headerHeight; 
} 
+3

'तालिका दृश्य: heightForRowAtIndexPath: 'आपकी तालिका में प्रत्येक (!) एकल पंक्ति के लिए बुलाया जाता है देखें। इस वजह से, 'tableView: cellForRowAtIndexPath:' जैसी महंगी कॉल का उपयोग नहीं किया जाना चाहिए। –

+0

यह सुनिश्चित नहीं है कि यह क्यों मतदान किया गया क्योंकि इस विधि से आप सेल की वास्तविक ऊंचाई के खिलाफ परीक्षण कर सकते हैं भले ही लेबल एकमात्र सामग्री न हो। हालांकि, यह बहुत महंगा है। – Kyle

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