Вы можете рассчитать подобранный размер UILabel на основе содержимого NSString, используя категорию UIKitAdditions на NSString. Эти методы включают ...
-sizeWithFont:
-sizeWithFont:constrainedToSize:
-sizeWithFont:constrainedToSize:lineBreakMode:
-sizeWithFont:forWidth:lineBreakMode:
-sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:
В моих реализациях этого шаблона я обычно использую третий, -sizeWithFont:constrainedToSize:lineBreakMode:
.
Наиболее эффективные реализации переменной высоты UITableViewCells вычисляют размер только один раз для отображаемой строки. Обычно это дорогостоящая операция, и вы определенно не хотите, чтобы дорогие операции выполнялись часто во время прокрутки - ваш FPS прокрутки упадет через пол. Это означает, что где-то кешируется вычисленная высота, а для меня это где-то объект модели, связанный с конкретной строкой.
Лично я создаю собственный подкласс UITableViewCell всякий раз, когда я реализую ячейку таблицы переменной высоты. Затем я создаю метод класса, который просто выполняет операцию sizeWithFont:constrainedToSize:lineBreakMode:
для объекта модели, который будет содержать строку, отображаемую в качестве параметра. Тогда реализация контроллера табличного представления tableView:heightForRowAtIndexPath:
выглядит примерно так:
- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath {
CGFloat height;
DataObject *rowData = [self.dataArray objectAtIndex:indexPath.row];
if (rowData.cachedHeight) {
height = [rowData.cachedHeight doubleValue];
} else {
height = [CustomTableViewCell heightForRowWithString:rowData.contentStr];
rowData.cachedHeight = [NSNumber numberWithDouble:height];
}
return height;
}
N.B. Вы могли бы / должны, вероятно, использовать UILabel, а не UITextView, поскольку вам не нужно поведение прокрутки UITextView.