Динамическая высота UILabel работает после перемещения за пределы экрана

Я пытаюсь создать многострочный динамический UILabels в UITableViewCells. У меня есть пользовательский UITableViewCell, который имеет метку "комментарий". Ячейка и метка создаются в раскадровке.

Я могу правильно рассчитать высоту UITableViewCells на основе многострочных данных, которые будут храниться в UILabel (используя heightForRowAtIndexPath). Однако моя проблема заключается в реальном содержании UILabel. Содержимое UILabel будет отображать только 1 строку данных о загрузке таблицы. Однако, как только ячейка, содержащая многострочные данные UILabel, перемещается за пределы экрана и возвращается на экран, многострочные данные правильно отображаются в UILabel с несколькими строками. Есть ли способ исправить это, чтобы многострочные данные правильно отображались при загрузке таблицы?

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cCell = (CustomCell *)cell;
    MyObject = [myArray objectAtIndex:indexPath.row];

    cCell.commentLabel.frame = CGRectMake(65.0f, 28.0f, 243.0f, 200.0f);
    cCell.commentLabel.text = MyObject.multi_line_text_data;
    cCell.commentLabel.adjustsFontSizeToFitWidth = NO;
    cCell.commentLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    cCell.commentLabel.font = [UIFont systemFontOfSize:13.0];
    cCell.commentLabel.lineBreakMode = NSLineBreakByWordWrapping;
    cCell.commentLabel.numberOfLines = 0;
    [cCell.commentLabel sizeToFit];

}

Спасибо!

2 ответа

Решение

Поскольку вы делаете это в раскадровке, вы можете установить там необходимые свойства метки (lineBreakMode и количество строк). Просто присвойте метке конкретное ограничение ширины и ограничения для верхней, нижней и левой сторон ячейки. Затем в коде используйте sizeWithFont:constrainedToSize:lineBreakMode: in heightForRowAtIndexPath: для вычисления соответствующей высоты для ячейки на основе содержимого метки - метка из-за своих ограничений будет расширяться вместе с ячейкой до нужного размера. Что-то вроде этого:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    CGSize rowSize = [self.theData[indexPath.row] sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(260, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
    return rowSize.height + 30;
}

Здесь 260 - это ширина, которую я присвоил метке в IB, а 30 - коэффициент выдумки (определяемый эмпирически) для учета заполнения выше и ниже метки.

Я встретил те же проблемы. Отключение Autolayout может исправить это.

Другие вопросы по тегам