2009-07-15 55 views
19

Tôi sử dụng UITableView với các ô được tạo bằng cách sử dụng UITableViewCellStyleSubtitle. Chiều cao của mỗi ô được điều chỉnh động bằng cách sử dụng phương pháp ủy quyềnNhãn căn chỉnh trong UITableViewCell

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

.

Vấn đề bạn có thể thấy trên hình ảnh

( lưu ý: hình ảnh được cập nhật)

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

Làm thế nào để thiết lập class của textLabel và detailTextLabel lên đỉnh của tế bào ? (Tôi thật sự không wont làm điều đó bằng cách subclassing UITableViewCell và layoutSubviews trọng)

Thanx

+0

Có vẻ như văn bản phụ đề của bạn đang chảy ở cuối ô và vào ô tiếp theo, đây có phải là những gì tôi thấy không? Ngoài ra, điều này có xảy ra trên thiết bị hay chỉ là Trình mô phỏng không? – jbrennan

+0

Bạn có thể đăng triển khai của mình trên heightForRowAtIndexPath không? –

+4

Chạm đẹp với ảnh chụp màn hình. –

Trả lời

8

Đây là giải pháp khác không có phân lớp, vì vậy chắc chắn nó hoạt động với các kiểu bảng khác nhau. (Tôi chưa kiểm tra các giải pháp khác.) Chuỗi tiêu đề và chi tiết được khai báo trong tiêu đề UITableViewController của tôi và đã được xác định. Họ không phải là rất dài, chắc chắn cũng trong vòng chiều cao 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

Tuy nhiên bạn đang cỡ các tế bào của bạn, bạn nên làm điều đó với các phương pháp định cỡ khác nhau của NSString. Bằng cách đó, bạn có thể xác định chính xác độ cao để tạo ô và tránh khoảng trắng.

36

Vâng, điều này khiến tôi phải trả một buổi chiều, nhưng tôi nghĩ tôi đã tìm ra nó. Theo như tôi có thể nói, điều này dường như là một lỗi trong cách UITableViewCell đặt ra textLabel và detailTextLabel. Khi bạn đặt chiều cao hàng, có vẻ như phân bổ chiều cao bằng nhau cho hai nhãn, có nghĩa là bạn nhận được chính xác hành vi mà bạn đang nhìn thấy ở trên, mặc dù detailTextLabel cần nhiều chỗ hơn. Dưới đây là hai điều tôi đã làm để khắc phục sự cố. Tôi đã phải phân lớp UITableViewCell để sửa chữa nó, nhưng đó là một số lượng tối thiểu của mã.

Trước tiên, hãy đảm bảo bạn đang tính toán chiều cao của mỗi hàng một cách chính xác. Đặt phương thức này vào bảng xem đại biểu của bạn. Thay thế các phương pháp phông chữ với riêng bạn:

- (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; 
} 

Sau đó, lớp con UITableViewCell và ghi đè 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

Câu trả lời hay, hoạt động hoàn hảo. Chạm đẹp: thay thế 4.0 bằng 12.0 nếu detailTextLabel.text == nil để căn giữa textLabel theo chiều dọc trong chế độ xem khi không có chi tiếtText cho ô. –

+0

Nó giống như một sự quyến rũ! – wal

+0

Đây là một mẹo thực sự hữu ích. Cảm ơn! –

-2

Nếu nó quay ra rằng textLabel và detailTextLabel được lát bằng mặt nạ autoresizing, có lẽ bạn có thể làm điều này khi bạn trả lại ô:

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

Nếu điều này làm việc, nó dễ dàng hơn một chút so với phân lớp con. Tôi đã không thử nó mặc dù.

+0

Tất nhiên là dễ dàng, nhưng không kiếm được việc làm. layoutSubviews-ghi đè là đúng cách. – slatvick

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