Единственная проблема, которую я обнаружил с принятым ответом, заключалась в том, что мы выделяем UITextView каждый раз. Я обнаружил, что это вызвало проблемы с вводом в представление и немедленным обновлением текста, а также сохранением представления в качестве первого респондента. Когда я попытался перезагрузить ячейку с новой высотой, он попытался бы добавить новый textView.
Из-за этого я нашел немного другой способ достижения той же цели. Надеемся, что этот другой подход может помочь людям, которые пытаются реализовать приведенный выше код.
1) В заголовочном файле определите переменную для высоты текста и textView:
UITextView * _textView;
NSInteger _textHeight;
Установка переменной означает, что мы можем загрузить представление, чтобы оно было определенной высоты, если мы загружаем текст в textView, а также уменьшает сложность.
2) Загрузите текстовое представление и добавьте его в нашу ячейку
_textView = [[UITextView alloc] init];
_textView.delegate = self;
_textView.returnKeyType = UIReturnKeyDone;
_textView.font = [UIFont fontWithName:@"Helvetica" size:16];
if (![_user metaStringForKey:bBioKey].length) {
_textView.text = @"Placeholder text";
_textView.textColor = [UIColor lightGrayColor];
}
- (UITableViewCell *)tableView:(UITableView *)tableView_ cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath == 0) { // Add logic to choose the correct cell
if (_textView.superview != cell) {
[cell addSubview:_textView];
_textView.keepTopInset.equal = KeepRequired(7);
_textView.keepBottomInset.equal = KeepRequired(7);
_textView.keepRightInset.equal = KeepRequired(10);
_textView.keepLeftInset.equal = KeepRequired(70);
}
}
}
}
Использование keeplayout позволило нам сохранить наше текстовое поле всегда на той же высоте, что и ячейка. Мы также только один раз добавляем наш UITextView.
3) Добавьте код для расчета высоты текста
- (NSInteger)getHeightOfBio: (NSString *)text {
UILabel * gettingSizeLabel = [[UILabel alloc] init];
gettingSizeLabel.font = [UIFont fontWithName:@"Helvetica" size:16];
gettingSizeLabel.text = text;
gettingSizeLabel.numberOfLines = 0;
CGSize maximumLabelSize = CGSizeMake(240, 9999); // this width will be as per your requirement
CGSize expectedSize = [gettingSizeLabel sizeThatFits:maximumLabelSize];
return expectedSize.height;
}
Я пробовал много и нашел, что это работает лучше всего
4) Добавьте немного логики в высоту ячейки, чтобы использовать это:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 0) { // Set the height for our changing textView
return 30 + [self getHeightOfBio:_textView.text];
}
return 44;
}
Очевидно, что нам нужно немного больше высоты, чем высота текста, поэтому я добавил дополнительное количество подушки, с которым можно поэкспериментировать.
5) Обновляйте представление каждый раз, когда вводится символ, чтобы проверить, нужно ли нам увеличивать размер:
- (void)textViewDidChange:(UITextView *)textView {
if ([self getHeightOfText:textView.text] != _textHeight) {
_textHeight = [self getHeightOfText:textView.text];
[self.tableView beginUpdates];
[self.tableView endUpdates];
}
}
В этом разделе мы получаем высоту текста каждый раз, когда пользователь печатает.
Тогда, хотя мы используем наше сохраненное значение и сравниваем текущее значение с сохраненным значением. Очевидно, что если они одинаковы, то нет смысла обновлять представление. Если они отличаются, мы обновляем значение и затем обновляем нашу таблицу.
Этот бит я нашел хороший ответ на stackOverflow, показывающий, как мы можем обновлять только высоты таблицы вместо самой ячейки. Зачем обновлять камеру, когда нам не нужно? Это означает, что как только это называется, высота ячейки обновляется, и она приятно увеличивается.
Во всяком случае, я обнаружил, что это работает очень хорошо и достаточно просто, чтобы его можно было собрать вместе или взять разные части и вставить в куски кода других людей.
Подсказки к принятому ответу, который был разграблен для разных частей пути, но я также надеюсь, что этот ответ поможет некоторым людям, которые испытывают те же трудности, что и я.