Держите нижнюю часть TableView видимой, когда клавиатура отображается с автоматическим расположением в Swift - PullRequest
0 голосов
/ 23 октября 2018

У меня есть табличное представление с текстовым представлением для ввода текста непосредственно под ним, как в Apple Messages.Когда пользователь начинает вводить текст и появляется клавиатура, я хочу следующее поведение, подобное сообщениям IOS.

  1. Если клавиатура ничего не закрывает, видимая часть табличного представления остается неизменной.

  2. Если клавиатура что-то накрывает, табличное представление сдвигается вверх настолько, что ее самая нижняя заполненная ячейка находится чуть выше клавиатуры.

Поскольку я использую autolayout, в настоящее время у меня есть ограничение между табличным представлением и текстовым представлением под ним.Кроме того, в проекте есть IQKeyboard, который управляет многими другими представлениями, включая текстовые поля и текстовые представления.

Ограничение, объединенное с IQKeyboard, выполняет 2. Когда появляется клавиатура, клавиатура толкает текстовое представление вверх.Текстовое представление поднимает табличное представление вверх.Таким образом, если табличное представление заполнено полностью, вы видите последнюю ячейку табличного представления над текстовым представлением над клавиатурой, как вам необходимо.

Однако 2. не работает.

, если табличное представление незаполнено, клавиатура выдвигает текстовое представление, которое увеличивает табличное представление, так что вы больше не видите верхнюю часть табличного представления.

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

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

Content offset approach - problem is that content offset adjusts too late
//register for keyboard notifications and in handler:
if let infoKey  = notification.userInfo?[UIKeyboardFrameEndUserInfoKey],
   let rawFrame = (infoKey as AnyObject).cgRectValue {
     let keyboardFrame = view.convert(rawFrame, from: nil)
     self.heightKeyboard = keyboardFrame.size.height
     UIView.animate(withDuration: 0.2, animations: {
             self.tableView.contentInset = UIEdgeInsetsMake(self.heightKeyboard!, 0, 0, 0);
     })
}

Может кто-нибудь предложить способ имитации поведения Apple Messages?Заранее спасибо за любые предложения.

1 Ответ

0 голосов
/ 25 октября 2018

Один подход:

  • ограничение верхней части tableView к вершине представления
  • ограничение нижней части tableView к вершине textField
  • ограничить нижнюю часть textField до нижней части представления
  • создать @IBOutlet для нижнего ограничения textField

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

Это переместит textField вверх, а поскольку его верхняя часть ограничена нижней частью tableView, он также переместит нижний край tableView вверх.

Затем прокрутите до конца таблицы.

Макет:

enter image description here

Исходная иерархия с 20 строками (с прокруткой)вниз):

enter image description here

Иерархическое представление (цвет фона tableView установлен на зеленый, поэтому мы можем видеть его рамку):

enter image description here

Вид после отображения клавиатуры:

enter image description here

Отображается иерархия после клавиатуры:

enter image description here

Немного жесткочтобы видеть из статических экранных шапок, но рамка зеленого прямоугольника (фон tableView) теперь короче ... пользователь все еще может прокручивать вверх и вниз, чтобы увидеть все строки, но нижняя часть tableView все еще ограниченаверхняя часть textField.

Когда клавиатура закрыта, установите .constant нижнего ограничения textField обратно в ноль.

Вы можете увидеть полный рабочий пример проекта на GitHub.: https://github.com/DonMag/KBAdjust

...