Я без проблем использую уведомления клавиатуры и получаю точную высоту клавиатуры.
- (void)keyboardDidShow:(NSNotification *) notification{
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
NSLog(@"%f",keyboardSize.height);}
но с iOS 11 размер клавиатуры равен 0 при вызове уведомления.
Какая проблема возникает в этом сценарии? Я использую xcode 9 Beta 5
Заменить
UIKeyboardFrameBeginUserInfoKey
с участием
UIKeyboardFrameEndUserInfoKey
Ниже приведен документ Apple Docs.
источник
Попробуй это:
Заменить
UIKeyboardFrameBeginUserInfoKey
наUIKeyboardFrameEndUserInfoKey
источник
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
метод keyboardWillChangeFrame: запускается не только один раз, может быть, дважды или больше. Может быть, на некоторых клавиатурах иногда есть специальная панель инструментов сверху, метод будет запускаться много раз в это время. Поэтому вам следует заменить UIKeyboardFrameBeginUserInfoKey на UIKeyboardFrameEndUserInfoKey, чтобы получить окончательный кадр клавиатура.У меня была аналогичная проблема с использованием 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, и это устранило проблему для меня.
источник
Эта проблема возникает на iOS 11.
Код цели-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
источник
Рассчитайте высоту клавиатуры, используя приведенный ниже код.
Код:
@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 } }
источник
Ваш подход пытается получить высоту кадра до того, как он будет показан, и поэтому он должен быть 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 }
Это правильно предоставит свойства рамки клавиатуры ДО появления клавиатуры.
источник