Динамическая высота iOS UITableViewCell и heightForRowAtIndexPath
Я использую Autolayout для моих новых UITableViewCells в большом проекте.
У меня есть одно TableView, где высота каждой строки рассчитывается автоматически, там я не использую функцию делегата heightForRowAtIndexPath
,
Я объявил примерную высоту строки:
tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension
Мой вопрос: на другом TableViewController есть много UITableViewCells, где мне нужно программно объявить высоту ячейки в heightForRowAtIndexPath
, Я знаю, что было бы лучше преобразовать все ячейки, чтобы использовать уникальное решение, но в этом проекте много разных ячеек, поэтому я хотел бы использовать обходной путь и объединить динамически вычисленную высоту с автопоставкой и программно вычисленной строкой рост.
Это возможно?
3 ответа
Если вы используете iOS 8 и выше, вам не нужно рассчитывать высоту динамически. Авто верстка сделает все за вас. Но если вы используете ниже, чем IOS 8, вам нужно рассчитать высоту ячейки.
Для IOS 8:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewAutomaticDimension;
}
И добавьте ниже код в вашем контроллере:
tableView.estimatedRowHeight = 400.0
tableView.rowHeight = UITableViewAutomaticDimension
куда estimatedRowHeight
должна быть максимальная высота, которая может быть для вашей клетки.
Спасибо
Рассчитать высоту содержимого динамически, используя boundingRectWithSize
, Если у тебя есть UILabel
который является динамическим, вы можете использовать следующее:
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
/* Check Content Size and Set Height */
CGRect answerFrame = [YOUR_LABEL.text boundingRectWithSize:CGSizeMake(240.f, CGFLOAT_MAX) options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName:[UIFont fontWithName:@"" size:14.0f]} context:nil];
CGSize requiredSize = answerFrame.size;
return requiredSize.height;
}
Вы можете попробовать это.
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
int topPadding = cell.yourLabel.frame.origin.x;
int bottomPadding = cell.frame.size.heigth-(topPadding+cell.yourLabel.frame.size.height);
NSString *text = [DescArr objectAtIndex:[indexPath row]];
CGSize maximumSize = CGSizeMake(cell.yourLabel.frame.size.width, 9999);
CGSize expectedSize = [text sizeWithFont:yourCell.yourLabel.font constrainedToSize:maximumSize lineBreakMode:yourCell.yourLabel.lineBreakMode];
return topPadding+expectedSize.height+bottomPadding;
}