Я использую tableView.setContentOffset(...)
для перемещения ячейки, удерживающей UITextView
над клавиатурой, когда TextView становится первым респондентом. Если это смещение контента находится за пределами диапазона, на который пользователь обычно может перейти, вызов beginUpdates() ... endUpdates()
в этом состоянии заставит TableView вернуться к normal contenOffset.
How чтобы предотвратить это?
Подробности
- Простой
UIViewController
, содержащий UITableView
- Самая нижняя ячейка TableView содержит a
UITextView
- Когда TextField становится первым респондентом, TextView / Cell, конечно же, следует перемещать над клавиатурой. Я нашел некоторую информацию, что iOS / TableView должен обрабатывать это сам, но это не так (я что-то не так делаю?)
- Поэтому я обрабатываю
UIResponder.keyboardWillShowNotification
, чтобы получить информацию о кадре клавиатуры и установить contenOffset вручную переместить ячейку TextView над клавиатурой. - Пользователь не сможет прокрутить до этого contentOffset, но его установка вручную не составит проблемы.
- Высота ячейки должна адаптироваться к Высота TextView при вводе нескольких строк. Поэтому я вызываю
beginUpdates() ... endUpdates()
, чтобы позволить TabelView обновить высоту ячейки. - Это обновление запускает TableView для сброса его положения и возврата к normal contentOffset, который показывает ячейку внизу и, следовательно, за клавиатурой.
Как воспроизвести
Конечно, проблему можно воспроизвести, создав настройку, описанную выше. Но возможно и более простое решение
UITableView
с некоторым случайным контентом - ButtonA устанавливает contentOffset, который находится за пределами нормального диапазона прокрутки
- Вызовы ButtonB
beginUpdates() ... endUpdates()
- ==> Попытайтесь запретить прокрутку TableView и сохранить тот же contentOffset, что и до обновления ...
Что НЕ работало
В других вопросах я нашел следующие решения, но ни одно из них не сработало:
// Disable animations before update ==> No effect
let contentOffset = self.tableView.contentOffset
UIView.setAnimationsEnabled(false)
self.tableView.beginUpdates()
self.tableView.endUpdates()
UIView.setAnimationsEnabled(true)
self.tableView.setContentOffset(contentOffset, animated: false)
// Remove layer animation after update ==> No effect
let contentOffset = self.tableView.contentOffset
self.tableView.beginUpdates()
self.tableView.endUpdates()
self.tableView.layer.removeAllAnimations()
self.tableView.setContentOffset(contentOffset, animated: false)