Изменение высоты строки UITableView без отклонения клавиатуры
У меня есть TextView внутри UITableViewCell. Текст внутри TextView можно редактировать там, где есть.
TextView растет и сжимается вертикально в зависимости от количества строк, содержащихся в тексте. До сих пор я не нашел возможности также позволить строке, содержащей TextView, расти и динамически сокращаться.
[tableView reloadData];
или
[tableView reloadRowsAtIndexPaths: withRowAnimation:];
не работают, потому что они отклоняют клавиатуру при каждом изменении.
Есть ли способ изменить высоту отдельной строки в UITableView без отклонения клавиатуры?
Ответы
Ответ 1
Да, вы можете настроить высоту строк по мере ввода. Это не задокументировано, и это бросает вызов причине, но все, что вам нужно сделать, это установить новое значение в tableView.rowHeight(или иметь heightForRowAtIndexPath: готов к вычислению новых высот), а затем сделать это:
[tableView beginUpdates]; // updates the row heights ...
[tableView endUpdates]; // ... nothing needed in between
Ответ 2
После reloadRowsAtIndexPaths ячейка изменяет значение памяти, поэтому, если вы вызываете startFirstResponder сразу после reloadRowsAtIndexPaths, вы пытаетесь установить в качестве firstResponder старую ячейку, которая не существует (startFirstResponder возвращает ложные и клавиатурные выходы).
Решение состоит в том, чтобы снова вызвать cellForRowAtIndexPath, чтобы получить новое значение памяти перезагруженной ячейки, а затем вызвать функцию getFirstResponder для этой ячейки.
Ответ 3
Задача состоит в том, чтобы вызвать перерасчет высоты строки без повторного использования ячеек (чтобы сохранить текущий ответчик).
Можно вызвать moveRowAtIndexPath:toIndexPath:
для одного и того же indexPath сразу после изменения высоты
- (void)textInputTableView:(UITableView *)tableView cellHeightDidChangeForIndexPath:(NSIndexPath *)indexPath
{
[tableView moveRowAtIndexPath:indexPath toIndexPath:indexPath];
}