UITableViewCell, UITextView с динамической высотой

Мне нужно сделать UITableViewCell, который содержит много текста. Я знаю, что могу добавить UITextView в свою ячейку, но каждая запись не будет содержать одинаковое количество текста.

Я знаю, что могу контролировать высоту UITableViewCell с помощью: -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath, но это не совсем то, что мне нужно.

Сценарий 1:

 ---------------
| First Cell    |
 ---------------
 ---------------
| Second Cell   |
| with some     |
| text.         |
 ---------------
 ---------------
| Third Cell    |
 ---------------

Сценарий 2:

 ---------------
| First Cell    |
 ---------------
 ---------------
| Second Cell   |
| with some     |
| more text and |
| an unknown    |
| cell height.  | 
 ---------------
 ---------------
| Third Cell    |
 ---------------

person WrightsCS    schedule 03.02.2011    source источник
comment
неясно, что вы ищете, -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath - это стандартный способ сделать это.   -  person Guy Ephraim    schedule 03.02.2011
comment
Да, но когда вы не знаете заранее высоту ячейки, это не имеет смысла.   -  person WrightsCS    schedule 03.02.2011


Ответы (3)


Используйте UILabel для текста ячейки. Затем вы можете использовать sizeWithFont:constrainedToSize: для вычисления высоты этого UILabel в каждой ячейке. Например:

#define PADDING 10.0f

- (CGFloat)tableView:(UITableView *)t heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *text = [self.items objectAtIndex:indexPath.row];
    CGSize textSize = [text sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(self.tableView.frame.size.width - PADDING * 3, 1000.0f)];

    return textSize.height + PADDING * 3;
}
person Anh    schedule 03.02.2011
comment
Что касается самого UILabel, используйте sizeWithFont:constrainedToSize: для предварительного расчета требуемого размера и отрисовки его с помощью drawInRect:withFont: - person Anh; 03.02.2011
comment
Какую оболочку предполагает sizeWithFont:constrainedToSize:? - person Bogatyr; 03.03.2011
comment
+1 спасибо за это, у меня есть динамическая метка в ячейке таблицы, и это сработало отлично! Мне также пришлось установить рамку метки в cellForRowAtIndexPath для расчета textSize. - person Bogatyr; 03.03.2011
comment
@Богатырь: Он использует UILineBreakModeWordWrap. Переключитесь на sizeWithFont:constrainedToSize:lineBreakMode:, если хотите указать это самостоятельно. - person Anh; 04.03.2011
comment
Только UILabel размещает текст с использованием этого размера? Или это также работает с UITextView? - person Bogatyr; 04.03.2011
comment
Это действительно способ сделать это? Наличие у UITableViewViewController необходимости знать интимные подробности о ячейке нарушает принципы инкапсуляции. Там должен быть лучший способ. Почему что-либо, кроме UITableViewCell и UITableView, должно знать что-либо о высоте ячейки? - person meddlingwithfire; 11.01.2012
comment
Я хочу добиться подобного эффекта; чтобы пользователь мог вводить данные в каждую из этих ячеек, поэтому я хочу использовать UITextView. Как это делается? - person fatuhoku; 26.06.2014

Решение довольно простое и должно работать, начиная с iOS 7. Убедитесь, что опция Scrolling Enabled выключена выключена для UITextView внутри UITableViewCell в StoryBoard.

Затем в viewDidLoad() вашего UITableViewController установите tableView.rowHeight = UITableViewAutomaticDimension и tableView.estimatedRowHeight > 0, например:

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.rowHeight = UITableViewAutomaticDimension
    tableView.estimatedRowHeight = 44.0
}

Вот и все. Высота UITableViewCell будет автоматически регулироваться в зависимости от высоты внутреннего UITextView.

person petrsyn    schedule 25.08.2017

Это довольно сложный материал, так как он включает в себя такие вещи, как contentInset текстового представления, которое вам придется учитывать при расчете размера текста. Я записал свои знания и решение для расчета высоты UITableViewCell на основе внутреннего UITextView в моем блоге. Пост содержит код, который работает для универсальных приложений, как для стилей табличного представления, так и для автоповорота.

person d11n    schedule 04.12.2012