Моя проблема заключалась в том, что мое представление было в контроллере дочернего представления. Конвертация CGRect сделала свое дело.

дал интерфейс чата, в который я добавилconstraint дляtableView в нижней части экрана. Я изменяю значение ограничения, добавляя высоту клавиатуры, которая отлично работает на всех устройствах, кроме iPhone X.

Пользовательский интерфейс, когда клавиатура не видна:

Что хорошо.

Проблема в том, что когда появляется клавиатура, появляется пустое пространство между textView и клавиатурой:

Должен ли я попробовать другой подход для этого или он может быть решен с помощью ограничений?

Ответы на вопрос(2)

Решение Вопроса

е значения для вашего ограничения.

Вот пример реализации, которая обрабатываетUIKeyboardWillChangeFrame уведомление.

@objc private func keyboardWillChange(_ notification: Notification) {
    guard let userInfo = (notification as Notification).userInfo, let value = userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue else { return }
    let newHeight: CGFloat
    if #available(iOS 11.0, *) {
        newHeight = value.cgRectValue.height - view.safeAreaInsets.bottom
    } else {
        newHeight = value.cgRectValue.height
    }
    myConstraint.value = newHeight
}
 dimpiax21 нояб. 2018 г., 14:51
safeAreaInsets.bottom это то, что мне нужно, спасибо!
 nathangitter15 нояб. 2017 г., 13:39
@Amit Вам нужно будет проверить версию, если ваша цель развертывания <11.0 с тех порsafeAreaInsets не существует до iOS 11.
 Amit15 нояб. 2017 г., 06:31
Спасибо брат. Я собирался реализовать только эту логику, но вы ответили правильно. Разве это не странно, что мы должны проверить ОС?UIKeyboardFrameEndUserInfoKey следует вернуть высоту, вычтя из безопасной зоны вставки.
 Sayalee Pote17 окт. 2018 г., 08:05
view.safeAreaInsets.bottom имеет значение 0. И место для меня все еще существует.

ViewController, Я буду ссылаться на это какyourConstraint сейчас. Затем добавьте код, чтобы узнать, когда клавиатура отображается и когда она закрывается. Там вы меняетеconstant ограничения соответственно. Это позволяет вам продолжать использовать ограничения.

ВviewWillAppear:

NotificationCenter.default.addObserver(self, selector: #selector(YourViewController.keyboardWillShow), name:        NSNotification.Name.UIKeyboardWillShow, object: nil) // <=== Replace YourViewController with name of your view controller
NotificationCenter.default.addObserver(self, selector: #selector(YourViewController.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil) // <=== Replace YourViewController with name of your view controller

ВviewWillDisappear:

NotificationCenter.default.removeObserver(self)

В вашейUIViewController

@objc private func keyboardWillShow(notification: Notification) {
    guard let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else {
        yourConstraint.isActive = false // <=== 
        view.layoutIfNeeded()
        return
    }
    let duration: TimeInterval = ((notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue) ?? 0.4
    yourConstraint.constant = newValue // <===
    UIView.animate(withDuration: duration) {
        self.view.layoutIfNeeded()
    }
}

@objc private func keyboardWillHide(notification: Notification) {
    let duration: TimeInterval = ((notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue) ?? 0.4
    yourConstraint.constant = oldValue
    UIView.animate(withDuration: duration) {
        self.view.layoutIfNeeded()
    }
}

UIView.animate не обязательно (внутренняя часть блока), но это делает переход красивым.

 Amit14 нояб. 2017 г., 14:22
Я сделал то же самое. Проблема заключается вnewValue, Я добавилnewValue какkeyboardSize.height который отлично работает на всех устройствах, кроме iPhone X. Как вы можете видеть на первом изображении, для новой функции, закрывающей нижнюю строку, закрывается приложение. Я думаю, что пространство появляется, когда появляется клавиатура.
 erikmartens14 нояб. 2017 г., 14:26
Понимаю. Извините, что дублирую ваши усилия ... Можете ли вы опубликовать скриншот иерархии ваших представлений в раскадровке? Вы также пытались установить другое ограничение только для iPhone X? Вы можете различать устройства с чем-то вроде этогоstackoverflow.com/a/26962452/7270113

Ваш ответ на вопрос