Ранее я использовал это для работы в окне чата сообщений, в котором используется представление коллекции, но при использовании TableView я не смог отобразить текстовое представление над клавиатурой с использованием того же кода.Если я изменю bottomConstraint на значение, которое находится за пределами TableView, намного выше верха, это будет выглядеть нормально ... Это похоже на то, что блоки таблицы / находятся перед моим текстовым полем (также не видите z-index?).
В настоящее время я реализую версию, которая вместо этого перемещает весь вид вверх вместе с табличным представлением и сообщениями, но мне нужно, чтобы они все еще были видны.После поисков дольше, чем я должен признать, и из-за большого разочарования я не могу найти решение, которое соответствует моему сценарию, которое кажется странным и заставляет меня думать, что я что-то серьезно упускаю.Если бы кто-то мог указать мне правильное направление, я был бы очень благодарен!
Обе версии моего кода:
@IBOutlet weak var bottomConstraint: NSLayoutConstraint!
override func viewDidLoad() {
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)
}
// Code that moves the view - works but moves tableview messages off screen
@objc func keyboardWillChange(notification: Notification) {
guard let keyboardRect = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else {return}
if notification.name == UIResponder.keyboardWillShowNotification || notification.name == UIResponder.keyboardWillChangeFrameNotification {
view.frame.origin.y = -keyboardRect.height
}
else {
view.frame.origin.y = 0
}
}
// Old code that only works on Collection View
@objc private func keyboardWillChange(notification: Notification) {
guard let userInfo = (notification as Notification).userInfo, let value = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else {
return
}
if ((userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue) != nil {
let isKeyboardShowing = notification.name == UIResponder.keyboardWillShowNotification
var newHeight: CGFloat
if isKeyboardShowing {
if #available(iOS 11.0, *) {
newHeight = value.cgRectValue.height - view.safeAreaInsets.bottom
bottomConstraint.constant = newHeight
}
}
else {
newHeight = value.cgRectValue.height
bottomConstraint?.constant = view.safeAreaInsets.bottom + messageInputContainerView.bounds.height
}
}
}