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

84

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

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

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

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

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

Hassy
источник

Ответы:

190

Использовать этот:

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

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

let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size
s.zainulabideen
источник
1
Ты спас мне день
Елена Жукова
1
Спасибо, никогда бы не подумал об этом
Аммар Хаджич
5
Переход с UIKeyboardFrameBeginUserInfoKey на UIKeyboardFrameEndUserInfoKey добился цели, спасибо.
user2408952 08
Спасибо, полдня вложил, но так и не разобрался. спасибо, что сэкономили мне вторую половину дня.
Маниш Нахар
@Akshay Просто начальный и конечный кадры клавиатуры в соответствующих границах экрана.
s.zainulabideen
102

Заменить UIKeyboardFrameBeginUserInfoKey

с участием

UIKeyboardFrameEndUserInfoKey

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

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

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

Адитья Шривастава
источник
13
Apple необходимо обновить свой пример кода, потому что он больше не работает на iOS 11. Также из документации Apple, где они используют UIKeyboardFrameBeginUserInfoKey: developer.apple.com/library/content/documentation/…
wildcat12,
Решил мою проблему! Спасибо за совет!
Эрни
Может ли кто-нибудь объяснить мне, как будто мне 5 лет, в чем разница между этими двумя и почему это имеет значение, когда дело доходит до автоматической прокрутки UIScrollView? Я был бы очень признателен за это. Благодаря!
Марио
Он не работает после нажатия на текстовое поле с помощью numPad. если после numPad я нажимаю на общее текстовое поле, клавиатура больше не активна, а когда она
Джек Дэниэл
7

Попробуй это:

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

SolinLiu
источник
1
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];метод keyboardWillChangeFrame: запускается не только один раз, может быть, дважды или больше. Может быть, на некоторых клавиатурах иногда есть специальная панель инструментов сверху, метод будет запускаться много раз в это время. Поэтому вам следует заменить UIKeyboardFrameBeginUserInfoKey на UIKeyboardFrameEndUserInfoKey, чтобы получить окончательный кадр клавиатура.
SolinLiu
5

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

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

    let heightValue = keyboardSize.height    

    ...
}

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

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

Andym
источник
1
Я заметил то же самое. Также кажется, что это применимо только к самому первому разу, когда отображается клавиатура. Клавиатуры на дополнительных контроллерах представления сообщили о высоте как 0 при первом отображении для этого контроллера представления.
jackofallcode 02
5

Эта проблема возникает на iOS 11.

Заменить

«UIKeyboardFrameBeginUserInfoKey» с «UIKeyboardFrameEndUserInfoKey»

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

Код цели-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
Суджай ООН
источник
3

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

Он работает как для устройств с безопасной, так и с небезопасной зоной.

Код:

@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
    }
}
Хитеш Сурани
источник
2

Ваш подход пытается получить высоту кадра до того, как он будет показан, и поэтому он должен быть 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
}

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

Рамин
источник