Получение правильного значения высоты клавиатуры при использовании пользовательских клавиатур — SWIFT 3

#ios #swift #keyboard #constraints #swift3

#iOS #swift #клавиатура #ограничения #swift3

Вопрос:

Итак, у меня есть a UIButton , который находится внизу UIView , пока не появится клавиатура, после чего нижнее ограничение обновляется до высоты клавиатуры.

Это отлично работает с клавиатурой iOS по умолчанию, но при использовании пользовательской клавиатуры, такой как SwiftKey, нижнее ограничение по-прежнему соответствует высоте клавиатуры iOS.

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

 @IBOutlet weak var fieldBottomConstant: NSLayoutConstraint!

var keyboardShowing = false

var keyboardHeight: CGFloat = 0.0

func keyboardWillShow(_ n:Notification) {

    self.keyboardShowing = true

    if let keyboardSize = (n.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
       // fieldBottomConstant.constant = keyboardSize.height
       keyboardHeight = keyboardSize.height
    }

    fieldBottomConstant.constant = keyboardHeight

}

func keyboardWillHide(_ n:Notification) {

    self.keyboardShowing = false

    fieldBottomConstant.constant = 0

}


override func viewWillAppear(_ animated: Bool) {
    NotificationCenter.default.addObserver(self, selector: #selector(AddViewController.keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(AddViewController.keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(AddViewController.keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(AddViewController.keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(AddViewController.keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardDidChangeFrame, object: nil)

}
  

Обновить

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

Ответ №1:

Ответ заключался в использовании

 UIKeyboardFrameEndUserInfoKey
  

Ответ №2:

Вы должны слушать NSNotification.Name.UIKeyboardWillChangeFrame