2011-08-19 32 views
9

Tôi mới phát triển ios và đây là vấn đề của tôi cho đến nay. Tôi có thể tự động tính toán chiều cao của ô tùy chỉnh thông qua đại biểu "heightForRowAtIndexPath". Vì vậy, trên tải đầu tiên, mọi thứ đều hiển thị hoàn toàn tốt đẹp.IOS: chiều cao động với một uitableviewcell tùy chỉnh

Vấn đề của tôi là ngay sau khi tôi bắt đầu cuộn, mọi thứ chỉ rối tung lên. Tôi nghĩ rằng trong khi di chuyển "heightForRowAtIndexPath" không còn được gọi cho mỗi tế bào có được hiển thị trên màn hình, do đó, chiều cao tế bào mới không thể được tính toán.

Vì vậy, tôi đã bị kẹt ở đây một thời gian. Tôi đã tự hỏi liệu có ai trong số các bạn có thể cho tôi mượn một tay không. cảm ơn bạn trước.

Tôi sẽ đăng mã vào các tệp có liên quan. Các tệp này bao gồm tệp h và m tùy chỉnh của ô. và các chức năng liên quan của tập tin m điều khiển xem.

// ###################################################### 
// 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; 
} 

Trả lời

4

Nếu văn bản trong các tế bào sẽ thay đổi, bạn sẽ cần đến một cuộc gọi reloadData trên tableView của bạn khi nó không, nếu không thì tableView: heightForRowAtIndexPath: sẽ không được gọi.

Cách bảng hoạt động là nó tập hợp các chiều cao cho tất cả các hàng ở mỗi lần tải lại (và các biến thể tải lại). Đây là cách iOS biết chiều cao của toàn bộ bảng. Nó không gọi tableView: heightForRowAtIndexPath: một lần nữa khi lấy các ô riêng lẻ. Thường gọi reloadData là khá nhanh và phương pháp này, không giống như các biến thể của nó, không gây ra bất kỳ cuộn nào.

Xem stackoverflow question and answer để biết nền hữu ích.

Sự cố phát sinh nếu bạn phải làm nhiều việc để tính chiều cao và bạn có hàng trăm hoặc hàng nghìn hàng. Trong một trường hợp sử dụng tôi có như thế này, tôi cache các tính toán chiều cao hàng để có được hiệu suất tốt. Nhưng nếu đó không phải là trường hợp của bạn, chỉ cần tự do hơn một chút với tải lạiData.

3

Có hướng dẫn tốt giúp bạn xác định chiều cao cần thiết cho vừa với văn bản và định kích thước ô phù hợp.

hướng dẫn có sẵn ở đây: http://www.raddonline.com/blogs/geek-journal/iphone-sdk-resizing-a-uitableviewcell-to-hold-variable-amounts-of-text/

tôi đã không cố gắng các phương pháp trong hướng dẫn bản thân mình, nhưng có vẻ được khá kỹ lưỡng.

Hy vọng điều này sẽ hữu ích!

1

bạn tableView:heightForRowAtIndexPath: dường như chính xác, nhưng bạn có thể muốn kiểm tra như sau về nhãn tế bào labelDescription trong tập tin XIB của bạn:

  • phải phù hợp với chiều rộng được sử dụng trong phương pháp tableView:heightForRowAtIndexPath: (trong trường hợp của bạn, 320)
  • phải phù hợp với phông chữ và kích thước được sử dụng trong phương pháp tableView:heightForRowAtIndexPath: (trong trường hợp của bạn "Arial" size 15)
  • thiết lập của nhãn "Điều chỉnh để phù hợp với" hộp kiểm để NO
  • thiết lập # sở hữu dòng để 0 (tức cách nó cho phép các văn bản để span nhiều dòng)

Nếu bạn nghi ngờ phương pháp tableView:heightForRowAtIndexPath: không nhận được gọi sau khi bạn di chuyển, bạn có thể dễ dàng xác minh rằng bằng cách thêm một NSLog tuyên bố tạm thời trong phương pháp đó. Nếu nó không bao giờ được gọi, bạn có thể đã quên đặt bộ điều khiển xem của mình là đại diện UITableViewDelegate của UITableView.

Các vấn đề liên quan