@objc private func keyboardWasShown(aNotification: NSNotification) {

        if let info = aNotification.userInfo as? [String: AnyObject] {
            if let keyboardFrame = info[UIKeyboardFrameBeginUserInfoKey] as? NSValue {
                let kbSize = keyboardFrame.cgRectValue.size
                containerViewBottomConstraint?.constant = -kbSize.height
                weak var weakSelf = self
                UIView.animate(withDuration: 0.4) {
                    weakSelf?.layoutIfNeeded()
                }
            }
        }
    }

Я попробовал уведомления как UIKeyboardDidShow, так и UIKeyboardDidShow.

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(aNotification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)


NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(aNotification:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil)

Это случается редко и когда qa тестирует. Я вижу, что клавиатура вычисляется как ноль. Также, когда у меня подключена аппаратная клавиатура и я удаляю ее, я вижу в коде, что высота клавиатуры равна нулю.

Это ошибка фреймворка Apple?

0
user1898829 15 Июн 2018 в 11:33

1 ответ

Лучший ответ

Аппаратная клавиатура:

  • В уведомлении указывается только высота клавиатуры, отображаемой на экране.

  • Когда к устройству подключена аппаратная клавиатура, клавиатура не должна отображаться на экране, и, следовательно, высота клавиатуры будет равна нулю.

Высота клавиатуры:

Я бы использовал уведомление UIKeyboardDidShow и UIKeyboardFrameEndUserInfoKey, чтобы получить рамку клавиатуры (и, следовательно, высоту)

@objc private func keyboardWasShown(notification: NSNotification) {
    
    guard let userInfo = notification.userInfo,
        let endFrame = userInfo[UIKeyboardFrameEndUserInfoKey] as? CGRect else {
            return
    }

    let keyboardHeight = endFrame.height
    
    print("keyboardHeight = \(keyboardHeight)")
}
1
Community 20 Июн 2020 в 09:12