Ну, это стоило мне дня, но, думаю, я понял это. Насколько я могу судить, это похоже на ошибку в том, как UITableViewCell размещает textLabel и detailTextLabel. Когда вы устанавливаете высоту строки, кажется, что она выделяет одинаковую высоту для двух меток, что означает, что вы получаете именно то поведение, которое видите выше, даже если detailTextLabel требует больше места. Вот две вещи, которые я сделал, чтобы решить проблему. Мне пришлось создать подкласс UITableViewCell, чтобы исправить это, но это минимальный объем кода.
Сначала убедитесь, что вы правильно рассчитываете высоту каждого ряда. Поместите этот метод в ваш делегат табличного представления. Замените методы шрифта своими собственными:
- (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;
}
Затем создайте подкласс UITableViewCell и переопределите 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