Динамическая высота 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 может исправить это.