2009-07-15 17 views
19

में संरेखित मैं UITableViewCellStyleSubtitle उपयोग कर बनाई गई कोशिकाओं के साथ UITableView का उपयोग करें।लेबल UITableViewCell

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

प्रतिनिधि विधि का उपयोग करके प्रत्येक सेल की ऊंचाई गतिशील रूप से समायोजित की जाती है।

समस्या आप चित्र

पर देख सकते हैं

( ध्यान दें: छवि अद्यतन)

http://img.skitch.com/20090715-g7srxgee2d7fhi5rab2wufrdgm.png

कैसे सेल के शीर्ष करने के पाठलेबल और detailTextLabel की संरेखित स्थापित करने के लिए ? (मैं वास्तव में UITableViewCell और अधिभावी layoutSubviews उपवर्गीकरण से यह करने के लिए अभ्यस्त नहीं है)

Thanx

+0

ऐसा लगता है कि आपका उपशीर्षक पाठ सेल के नीचे और अगले में बह रहा है, क्या मैं यह देख रहा हूं? साथ ही, यह डिवाइस या सिम्युलेटर पर भी होता है? – jbrennan

+0

क्या आप ऊंचाई के कार्यान्वयन को पोस्ट कर सकते हैं ForRowAtIndexPath? –

+4

स्क्रीनशॉट के साथ अच्छा स्पर्श। –

उत्तर

8

यहां कोशिकाओं को उप-वर्ग के बिना एक और समाधान है, इसलिए यह निश्चित रूप से विभिन्न तालिका शैलियों के साथ काम करता है। (मैंने अन्य समाधानों की जांच नहीं की है।) शीर्षक और विस्तार तारों को मेरे UITableViewController शीर्षलेख में घोषित किया गया है और पहले ही परिभाषित किया गया है। वे बहुत लंबे समय तक नहीं हैं, निश्चित रूप से ऊंचाई 4000 के भीतर अच्छी तरह से!

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

    CGRect frame = [UIScreen mainScreen].bounds; 
    CGFloat width = frame.size.width; 

    int section = indexPath.section; 
    int row = indexPath.row; 

    NSString *title_string = [title_strings_array objectAtIndex:row]; 
    NSString *detail_string = [detail_strings_array objectAtIndex:row]; 

    CGSize title_size = {0, 0}; 
    CGSize detail_size = {0, 0}; 

    if (title_string && [title_string isEqualToString:@""] == NO) { 
     title_size = [title_string sizeWithFont:[UIFont systemFontOfSize:22.0] 
           constrainedToSize:CGSizeMake(width, 4000) 
            lineBreakMode:UILineBreakModeWordWrap]; 
    } 

    if (detail_string && [title_string isEqualToString:@""] == NO) { 
     detail_size = [detail_string sizeWithFont:[UIFont systemFontOfSize:18.0] 
           constrainedToSize:CGSizeMake(width, 4000) 
            lineBreakMode:UILineBreakModeWordWrap]; 
    } 

    CGFloat title_height = title_size.height; 
    CGFloat detail_height = detail_size.height; 

    CGFloat content_size = title_height + detail_height; 

    CGFloat height; 

    switch (section) { 

     case 0: 
      height = content_size; 
      break; 

     //Just in case 
     default: 
      height = 44.0; 
      break; 

    } 

    return height; 

} 
1

लेकिन अगर आप अपनी कोशिकाओं आकार रहे हैं, आप NSString के विभिन्न आकार के तरीकों के साथ यह करना चाहिए। इस तरह, आप यह निर्धारित कर सकते हैं कि सेल बनाने और सफेद जगह से बचने के लिए कितना लंबा है।

36

ठीक है, इसने मुझे दोपहर का खर्च किया, लेकिन मुझे लगता है कि मैंने इसे समझ लिया। जहां तक ​​मैं कह सकता हूं, यह एक बग प्रतीत होता है कि UITableViewCell टेक्स्ट लेबल और विवरण टेक्स्टबेल को कैसे बिछा रहा है। जब आप पंक्ति की ऊंचाई निर्धारित करते हैं, तो यह दो लेबलों के बराबर ऊंचाई आवंटित करता है, जिसका अर्थ यह है कि आप वास्तव में जो व्यवहार देख रहे हैं उसे प्राप्त करते हैं, भले ही विवरण टेक्स्टबेल को और अधिक कमरे की आवश्यकता हो। समस्या को ठीक करने के लिए मैंने दो चीजें यहां दी हैं। मुझे इसे ठीक करने के लिए UITableViewCell को उप-वर्ग करना था, लेकिन यह कोड की न्यूनतम मात्रा है।

सबसे पहले, सुनिश्चित करें कि आप प्रत्येक पंक्ति की ऊंचाई की गणना कर रहे हैं। इस विधि को अपने टेबल व्यू प्रतिनिधि में रखें। अपने खुद के साथ फ़ॉन्ट तरीकों बदलें:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *cellDetailText = [[self itemForIndexPath: indexPath] detailDescription]; 
    NSString *cellText = [[self itemForIndexPath: indexPath] description]; 
    // The width subtracted from the tableView frame depends on: 
    // 40.0 for detail accessory 
    // Width of icon image 
    // Editing width 
    // I don't think you can count on the cell being properly laid out here, so you've 
    // got to hard code it based on the state of the table. 
    CGSize constraintSize = CGSizeMake(tableView.frame.size.width - 40.0 - 50.0, CGFLOAT_MAX); 
    CGSize labelSize = [cellText sizeWithFont: [self cellTextLabelFont] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; 
    CGSize detailSize = [cellDetailText sizeWithFont: [self cellDetailTextLabelFont] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; 

    CGFloat result = MAX(44.0, labelSize.height + detailSize.height + 12.0); 
    return result; 
} 

फिर, उपवर्ग UITableViewCell और ओवरराइड layoutSubviews:

#import "UITableViewCellFixed.h" 


@implementation UITableViewCellFixed 
- (void) layoutSubviews { 
    [super layoutSubviews]; 
    self.textLabel.frame = CGRectMake(self.textLabel.frame.origin.x, 
             4.0, 
             self.textLabel.frame.size.width, 
             self.textLabel.frame.size.height); 
    self.detailTextLabel.frame = CGRectMake(self.detailTextLabel.frame.origin.x, 
              8.0 + self.textLabel.frame.size.height, 
              self.detailTextLabel.frame.size.width, 
              self.detailTextLabel.frame.size.height); 
} 
@end 
+1

महान उत्तर, पूरी तरह से काम किया। अच्छा स्पर्श: 4.0 के साथ 4.0 को प्रतिस्थापित करें यदि विवरण TextLabel.text == nil पाठ के केंद्र में लंबवत रूप से देखने के लिए कक्ष में कोई विवरण नहीं है। –

+0

यह एक आकर्षण की तरह woks है! – wal

+0

यह वास्तव में उपयोगी चाल है। धन्यवाद! –

-2

यदि ऐसा पाया जाता है कि पाठलेबल और detailTextLabel autoresizing मास्क के टुकड़ों से कर रहे हैं, हो सकता है आप कर सकते हैं इस लिए जब आप सेल वापसी:

cell.textLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin; 
cell.detailTextLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

इस काम करता है, यह थोड़ा सेल उपवर्गीकरण अधिक आसान है। मैंने हालांकि कोशिश नहीं की है।

+0

बेशक यह आसान है, लेकिन नौकरी नहीं करता है। लेआउट सबव्यूव्स-ओवरराइडिंग सही तरीका है। – slatvick