2009-08-30 29 views
14

Tôi có một số UITableViewCells cần thay đổi chiều cao tùy thuộc vào độ dài của các chuỗi bên trong. Tôi đang tính toán chiều cao cần thiết bên trong tableView:cellForRowAtIndexPath:, và sau đó lưu trữ nó trong một biến (self.specialRowHeight). Sau đó, tôi đã có:Nhận tableView: heightForRowAtIndexPath: để xảy ra sau khi tableView: cellForRowAtIndexPath :?

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

Ngoại trừ việc dường như được gọi trước bit tableView:cellForRowAtIndexPath:, do đó, nó luôn bằng không.

Có cách nào khác hay không, hoặc có thể là cách khác để thực hiện?

Cảm ơn!

Trả lời

11

Gonna trả lời câu hỏi của riêng tôi ở đây:

Nguyên Tôi khá chắc chắn rằng các tính toán chiều cao được gắn liền với phương pháp tableView:cellForRowAtIndexPath:, và không thể di chuyển nơi khác. Với một loạt các cơ cấu lại, mặc dù, tôi đã có thể nhận được rằng công cụ ra khỏi đó và vào tableView:heightForRowAtIndexPath:, mà giải quyết tất cả mọi thứ.

Đối với bất kỳ ai khác đang cố gắng để có được các tế bào tự động chiều cao điều chỉnh để làm việc, đây là một số mã có thể giúp:

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

Nếu bạn có thể nghĩ ra một cách chính xác hơn để tính toán chiều cao di động thích hợp, Tôi là tất cả tai. :)

+0

Tôi không thực sự chắc chắn lý do tại sao bạn chia chiều cao trực tiếp cho 18 và sau đó nhân nó một lần nữa, nhưng khác hơn là tôi làm điều đó khá nhiều theo cùng một cách. –

+0

Vâng, bộ phận đầu tiên là tìm ra bao nhiêu hàng là cần thiết, vì vậy tôi có thể đặt chính xác 'cell.textLabel.numberOfLines'; nếu tôi không đặt nó, tất cả sẽ được in trên một dòng. Nhưng yeah, tôi đoán tôi chỉ có thể sử dụng 'theSize.height' trong bit cuối cùng ở đó, thay vì' self.numberOfTextRows'. – Triz

+0

Đã chỉnh sửa câu trả lời cho sự rõ ràng và đơn giản hóa. Hoạt động thực sự tốt ngay bây giờ. – Triz

0

Bạn chỉ có thể đặt self.numberOfLines thành 0 một lần và nó sẽ hoạt động tương tự. (Nếu numberOfLines được đặt thành 0 thì nhãn sử dụng như nhiều hàng như là cần thiết.)

+0

Um ... numberOfTextRows là thuộc tính lớp tùy chỉnh, vì vậy nó sẽ không làm bất cứ điều gì khác với những gì tôi nói với nó. Bạn đang nghĩ đến cell.textLabel.numberOfLines? – Triz

+0

Với bất kỳ giá nào, có, bạn có thể đặt 'cell.textLabel.numberOfLines' thành' 0', nhưng vẫn hữu ích khi tìm ra số thực sẽ được sử dụng (ví dụ để tính chiều cao hàng thích hợp, ví dụ như ở đây) . Ngoài ra tôi tìm thấy mã kết quả để được rõ ràng hơn nhiều, như "0" không phải là ở tất cả các ngữ nghĩa hữu ích trong nháy mắt. – Triz

-7

Giải pháp của tôi là để gọi tableView:cellForRowAtIndexPath: bên trong việc thực hiện các tableView:heightForRowAtIndexPath: như sau

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

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

'tableView: heightForRowAtIndexPath:' được gọi cho mỗi (!) Hàng đơn trong tableView của bạn. Bởi vì điều này, các cuộc gọi đắt tiền như 'tableView: cellForRowAtIndexPath:' không nên được sử dụng. –

+0

Bạn không chắc chắn tại sao điều này lại bị bỏ phiếu vì phương pháp này cho phép bạn kiểm tra với chiều cao thực tế của ô ngay cả khi nhãn không phải là nội dung duy nhất. Điều này tuy nhiên, rất tốn kém. – Kyle

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