Динамическая высота 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;
}
Другие вопросы по тегам