Переместите UITextField, когда клавиатура открывается в окне стиля чата, использующего TableView - PullRequest
0 голосов
/ 18 октября 2018

Ранее я использовал это для работы в окне чата сообщений, в котором используется представление коллекции, но при использовании 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
        }
    }
}
...