IOS 11 - Высота клавиатуры возвращается 0 в уведомлении клавиатуры

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

- (void)keyboardDidShow:(NSNotification *) notification{
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    NSLog(@"%f",keyboardSize.height);}

но с iOS 11 размер клавиатуры равен 0 при вызове уведомления.

В чем проблема, возникающая в этом сценарии? Я использую xcode 9 Beta 5

Ответ 1

Используйте это:

CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

Для Swift вы можете использовать:

let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size

Ответ 2

Заменить UIKeyboardFrameBeginUserInfoKey

с

UIKeyboardFrameEndUserInfoKey

Ниже приведены документы Apple.

UIKeyboardFrameBeginUserInfoKey- ключ для объекта NSValue содержащий CGRect, который идентифицирует начальный кадр клавиатуры в координатах экрана.

UIKeyboardFrameEndUserInfoKey - ключ для объекта NSValue содержащий CGRect, который идентифицирует конечный кадр клавиатуры в экранные координаты.

Ответ 3

Попробуйте следующее:

Замените UIKeyboardFrameBeginUserInfoKey на UIKeyboardFrameEndUserInfoKey

Ответ 4

У меня была аналогичная проблема с использованием Xcode Version 9.0 (9A235); хотя я использовал Свифт. В моем методе keyboardWillShow я написал следующее:

if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {

    let heightValue = keyboardSize.height    

    ...
}

Как ни странно, первый раз, когда была вызвана клавиатураWillShow, heightValue был 216.0, но во время последующих вызовов это стало 0! Возможно, это ошибка Xcode.

Я заменил UIKeyboardFrameBeginUserInfoKey на UIKeyboardFrameEndUserInfoKey, и он исправил эту проблему для меня.

Ответ 5

Эта проблема происходит на iOS 11.

Заменить

"UIKeyboardFrameBeginUserInfoKey" с "UIKeyboardFrameEndUserInfoKey"

как показано ниже, будет исправлена ​​проблема

Objective-C Код:

CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

Swift 2.3:

let keyboardSize = (NfnPsgVar.userInfo![UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue().size

Swift 3:

let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size

Ответ 6

Ваш подход пытается получить высоту кадра до того, как она будет показана, и именно поэтому она должна быть равна 0, что я не уверен, почему это не с первой попытки! Вот пример того, как правильно получить высоту клавиатуры в Swift 4.2:

func keyboardWillShow(notification: Notification) {

    guard let userInfo = notification.userInfo else { return }

    guard var keyboardFrame: CGRect = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else { return }

    keyboardFrame = view.convert(keyboardFrame, from: nil)

    let keyboardHeight = keyboardFrame.height
}

Это правильно предоставит свойства рамки клавиатуры ДО появления клавиатуры.

Ответ 7

Рассчитайте высоту клавиатуры, используя приведенный ниже код. Он работает как для устройств с safe area и non-safe area устройств.

@objc func keyboardWillShow(notification: Notification) {
    guard let keyboardFrame = notification.userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else {
            return
        }    
    let keyboardHeight: CGFloat                    
    if #available(iOS 11.0, *) {
       let window = UIApplication.shared.keyWindow
       let bottomPadding = window?.safeAreaInsets.bottom ?? 0.0
       keyboardHeight = keyboardFrame.cgRectValue.height - bottomPadding
    } else {
       keyboardHeight = keyboardFrame.cgRectValue.height
    }
}