2014-09-11 4 views
20

iOS 8 представил способ для таблицыViews автоматически настраивать высоту своей ячейки на основе их содержимого (через AutoLayout).iOS 8 auto-sizing UITableViewCell с UITextView

// in viewDidLoad: 
tableView.rowHeight = UITableViewAutomaticDimension 
tableView.estimatedRowHeight = 44.0 

Я уже получил его работу с ярлыками, изображениями и т.д.

Однако, я не могу выяснить способ для просмотра таблицы ячейки расти автоматически, как только изменения зрения текста Клетки в?

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

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

+0

любой прогресс в этой? Я ищу сделать то же самое ... Вы пытаетесь заставить его работать, пока пользователь вводит? Или UITextView, который вы используете, не редактируется пользователем? – Georg

ответ

4

Обновить ячейку в textViewDidBeginEditing: методы вашего UITextViewDelegate

[self.tableView beginUpdates]; 
[self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView endUpdates]; 

Очевидно, что вы должны изменить indexpath к правильной для вашей ячейки. Это позволит ячейке обновить свои ограничения и изменить размер.

+0

Уверен, что это работает, но я ищу более элегантный метод. – Alex

+2

Кажется, что он работает даже без 'reloadRowsAtIndexPaths:', который имеет преимущество клавиатуры, чтобы оставаться там. – Georg

+2

Для меня этот подход приводит к тому, что прокрутка в виде таблицы прокручивается вверху каждого нажатия клавиши, что делает просмотр текста в основном непригодным для использования - У кого-то еще есть такая проблема? (iOS 8.1.2) – James

0

Это функция, которую я использую, которая решает проблему отображения табличного вида назад после каждого нажатия клавиши.

- (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's 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]; 
     } 
    } 
+1

Что произойдет, если ячейка находится внизу, и вам нужно прокрутить до этой точки, чтобы она была видимой при начале редактирования строки? – Angie

+0

Да, к сожалению, у меня тоже есть эта проблема. Не используйте CLUE, как это исправить. – Bawpotter

18

Если все настроено правильно (Auto Layout ограничения) вы не вычислить ничего себе.

Все, что вам нужно сделать, это отключить свойство разрешенной прокрутки UITextView, затем на textViewDidChange позвонить tableView.beginUpdates() и tableView.endUpdates().

Для получения более подробного объяснения ознакомьтесь с post I wrote, который также включает рабочий образец проекта.

+0

Будет ли он работать с UIWebView вместо UITextView? –

+0

Я не уверен, UIWebView может иметь другую процедуру компоновки, но стоит попробовать! – Jure

+0

Просто удаление прокрутки, включенной в одиночку, работало для меня. спасибо :) – shyamsundar1988

0

решение для 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) 
    } 
} 
Смежные вопросы