IOS 8 автоматическая калибровка UITableViewCell с UITextView
В iOS 8 был введен способ, позволяющий tableViews автоматически корректировать высоту своей ячейки на основе их содержимого (через AutoLayout).
// in viewDidLoad:
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 44.0
Я уже работал с ярлыками, изображениями и т.д.
Тем не менее, я не могу определить способ, по которому ячейка представления таблицы будет расти автоматически, как только изменится вид текста ячейки?
Дополнительная информация о настройке:
UITextView внутри ячейки имеет горизонтальные и вертикальные ограничения для представления содержимого таблицы viewView. Я также отключил прокрутку для текстового вида.
Я также попытался изменить ограничение высоты ячейки вручную, но ячейка также не примет эти изменения.
Ответы
Ответ 1
Если все настроено правильно (ограничения Auto Layout), вы не должны сами что-то вычислять.
Все, что вам нужно сделать, это отключить свойство разрешенной прокрутки UITextView, а затем textViewDidChange
вызвать tableView.beginUpdates()
и tableView.endUpdates()
.
Подробное объяснение можно найти в сообщении которое я написал, которое также включает рабочий образец проекта.
Ответ 2
Перезагрузите ячейку в методе textViewDidBeginEditing:
вашего UITextViewDelegate
[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
Очевидно, вы должны изменить путь индекса к правильному для своей ячейки. Это позволит ячейке обновить свои ограничения и изменить размер.
Ответ 3
Решение для Swift 4
func textViewDidChange(_ textView: UITextView) {
let fixedWidth = textView.frame.size.width
let oldSize = textView.frame.size
let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT)))
if oldSize.height != newSize.height {
UIView.setAnimationsEnabled(false)
var newFrame = textView.frame
newFrame.size = CGSize(width: fmax(newSize.width, fixedWidth), height: newSize.height)
textView.frame = newFrame
self.tableView.beginUpdates()
self.tableView.endUpdates()
UIView.setAnimationsEnabled(true)
}
}
Ответ 4
Это функция, которую я использую, которая решает проблему отображения табличного представления после каждого нажатия клавиши.
- (void)textViewDidChange:(UITextView *)textView {
CGFloat fixedWidth = textView.frame.size.width;
CGSize oldSize = textView.frame.size;
CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
// Resize cell only when cell size changes, to prevent bouncing back and forth.
if (oldSize.height != newSize.height) {
[UIView setAnimationsEnabled:NO];
CGRect newFrame = textView.frame;
newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
textView.frame = newFrame;
[self.tableView beginUpdates];
[self.tableView endUpdates];
[UIView setAnimationsEnabled:YES];
}
}
Ответ 5
Вы должны отключить прокрутку из вашего UITextView
Ответ 6
tableView
должен быть проинформирован о том, что textView
изменился. Другие сообщения обычно отвечают на "статическую" проблему textView
. Однако, если вы печатаете внутри таблицы, ячейка должна расти по мере роста textView
. textView
растет путем отключения прокрутки. Ячейка растет, устанавливая верхние и нижние ограничения textView
на ограничения contentView
ячейки. Это будет работать один раз, после загрузки таблицы. Однако, чтобы заставить tableView
расти в реальном времени, вы должны выполнить вызов делегата textView
didChange
func textViewChanged(onCell cell: YourCustomCell) {
UIView.setAnimationsEnabled(false)
tableView.beginUpdates()
tableView.endUpdates()
UIView.setAnimationsEnabled(true)
}
Это будет работать, как вы ожидаете. Ячейка будет расти по мере того, как вы печатаете, и "подпрыгивания" не будет.