2011-08-19 13 views
9

के साथ गतिशील ऊंचाई IOS विकास में नया हूं और यह मेरी समस्या है। मैं प्रतिनिधि "heightForRowAtIndexPath" के माध्यम से एक कस्टम सेल की ऊंचाई गतिशील रूप से गणना करने में सक्षम हूं। तो पहले लोड पर, हर चीज पूरी तरह ठीक दिखती है।आईओएस: एक कस्टम यूटेबलव्यूसेल

मेरी समस्या जैसे ही मैं स्क्रॉलिंग शुरू करता हूं, सबकुछ बस गड़बड़ हो जाता है। मुझे लगता है कि "heightForRowAtIndexPath" को स्क्रॉल करते समय प्रति सेल नहीं कहा जाता है जो स्क्रीन पर डिस्प्ले प्राप्त करता है, इसलिए नई सेल ऊंचाई की गणना नहीं की जा सकती है।

तो मैं थोड़ी देर के लिए यहां फंस गया हूं। मैं सोच रहा था कि आप में से कोई मुझे हाथ उधार दे सकता है। पहले ही, आपका बहुत धन्यवाद।

मैं प्रासंगिक फाइलों में कोड पोस्ट करूंगा। इन फ़ाइलों में कस्टम सेल एच और एम फ़ाइल शामिल हैं। और दृश्य नियंत्रक एम फ़ाइल के प्रासंगिक कार्यों।

// ###################################################### 
// HelpTableViewCell.h 
#import <UIKit/UIKit.h> 

@interface HelpTableViewCell : UITableViewCell { 
    IBOutlet UILabel *labelName; 
    IBOutlet UILabel *labelDescription; 

    IBOutlet UIView *viewBackground; 
} 

@property (nonatomic, retain) UILabel *labelName; 
@property (nonatomic, retain) UILabel *labelDescription; 

@property (nonatomic, retain) UIView *viewBackground; 

@end 

// ###################################################### 
// HelpTableViewCell.m 
#import "HelpTableViewCell.h" 

@implementation HelpTableViewCell 

@synthesize labelName; 
@synthesize labelDescription; 

@synthesize viewBackground; 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 

    if (self) { 
    } 

    return self; 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated { 

    self.labelName.lineBreakMode = UILineBreakModeWordWrap; 
    self.labelName.numberOfLines = 0; 
    self.labelName.font = [UIFont boldSystemFontOfSize:15]; 
    [self.labelName sizeToFit]; 

    self.labelDescription.lineBreakMode = UILineBreakModeWordWrap; 
    self.labelDescription.numberOfLines = 0; 
    self.labelDescription.font = [UIFont fontWithName:@"Arial" size:15]; 
    [self.labelDescription sizeToFit]; 

    [super setSelected:selected animated:animated]; 
} 

- (void) dealloc { 
    [labelName release], labelName = nil; 
    [labelDescription release], labelDescription = nil; 

    [super dealloc]; 
} 

@end 


// ###################################################### 
// in my view controller m file 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"HelpTableViewCell"; 
    HelpTableViewCell *cell = (HelpTableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"HelpTableViewCell" owner:nil options:nil]; 

    for (id currentObject in topLevelObjects) { 
     if ([currentObject isKindOfClass:[UITableViewCell class]]) { 
     cell = (HelpTableViewCell *) currentObject; 
     break; 
     } 
    } 

    } 

    cell.labelName.text = [self.instructionName objectAtIndex:indexPath.row]; 
    cell.labelDescription.text = [self.instructionDescription objectAtIndex:indexPath.row]; 

    return cell; 
} 

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *cellText = [self.instructionDescription objectAtIndex:indexPath.row]; 
    UIFont *cellFont = [UIFont fontWithName:@"Arial" size:15]; 
    CGSize constraintSize = CGSizeMake(320.0f, MAXFLOAT); 
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; 

    return labelSize.height + 25; 
} 

उत्तर

4

कोशिकाओं में पाठ बदलने के लिए जा रहा है, तो आप एक फोन reloadData अपने tableView पर करने के लिए जब यह होता है, की आवश्यकता होगी अन्यथा tableView: heightForRowAtIndexPath: कहा जाता है नहीं किया जाएगा।

तालिका दृश्य जिस तरह से काम करता है वह यह है कि यह प्रत्येक रीलोड (और रीलोड वेरिएंट) पर सभी पंक्तियों के लिए ऊंचाई एकत्र करता है। इस प्रकार आईओएस पूरी तालिका की ऊंचाई जानता है। यह तालिका दृश्य नहीं है: heightForRowAtIndexPath: फिर व्यक्तिगत कोशिकाओं को पकड़ते समय। आम तौर पर कॉलिंग रीडाडाटा काफी तेज़ है और इसके तरीके, इसके रूपों के विपरीत, किसी भी स्क्रॉलिंग का कारण नहीं बनता है।

उपयोगी पृष्ठभूमि के लिए stackoverflow question and answer देखें।

समस्याएं उत्पन्न होती हैं यदि आपको ऊंचाइयों की गणना करने के लिए बहुत सारे काम करना पड़ता है और आपके पास सैकड़ों या हजारों पंक्तियां हैं। एक प्रयोग मामले में मुझे यह पसंद है, मैं सभ्य प्रदर्शन प्राप्त करने के लिए पंक्ति ऊंचाई गणना को कैश करता हूं। लेकिन अगर यह आपका मामला नहीं है, तो reloadData के साथ थोड़ा और उदार हो।

3

एक अच्छा ट्यूटोरियल है कि ऊंचाई है कि आपके पाठ फिट करने के लिए आवश्यक है निर्धारित करने और उचित रूप से सेल ऊंचाई आकार की प्रक्रिया से अवगत नहीं है।

ट्यूटोरियल यहाँ उपलब्ध है: http://www.raddonline.com/blogs/geek-journal/iphone-sdk-resizing-a-uitableviewcell-to-hold-variable-amounts-of-text/

मैं ट्यूटोरियल अपने आप में तरीकों कोशिश नहीं की है, लेकिन यह बहुत पूरी तरह से लग रहा है।

आशा है कि इससे मदद मिलती है!

1

आपका tableView:heightForRowAtIndexPath: सही लगता है, लेकिन आप अपने XIB फ़ाइल में labelDescription सेल लेबल के बारे में निम्नलिखित जांच करना चाह सकते:

  • (, आपके मामले में 320) tableView:heightForRowAtIndexPath: विधि में इस्तेमाल चौड़ाई से मेल खाना चाहिए
  • फ़ॉन्ट और आकार tableView:heightForRowAtIndexPath: विधि में प्रयोग किया जाता से मेल खाना चाहिए (आपके मामले में "Arial" आकार 15)
  • सेट लेबल के चेकबॉक्स नहीं
  • 0 लाइनों संपत्ति का # सेट करने के लिए "फिट करने के लिए समायोजित करें" (अर्थात्जिस तरह से यह आपको संदेह है आप स्क्रॉल के बाद tableView:heightForRowAtIndexPath: विधि कहा जाता हो नहीं है, तो पाठ कई पंक्तियों को पार करने वाली)

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

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