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
Nguồn
2009-07-16 19:20:33
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
Bạn có thể đăng triển khai của mình trên heightForRowAtIndexPath không? –
Chạm đẹp với ảnh chụp màn hình. –