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

Відповіді:


190

Використовуй це:

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

Для Swift ви можете використовувати:

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

1
Ти врятував мій день
Хелен Жукова,

1
Дякую, ніколи про це не думав би
Аммар Хаджич

5
Перехід від UIKeyboardFrameBeginUserInfoKey до UIKeyboardFrameEndUserInfoKey зробив свою справу, thx.
user2408952

Дякую, я вклав половину дня, але не зміг зрозуміти. дякую, що врятували мою другу половину дня.
Маніш Нахар

@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 я натискаю на загальне текстове поле, клавіатура вже не вгору, а коли вона відхиляє подання, опускаюся вниз
Jack Daniel

7

Спробуйте це:

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


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    

    ...
}

Дивно, але вперше було викликано клавіатуруWillShow, значення висоти було 216,0, але під час наступних дзвінків воно стало 0! Можливо, це помилка Xcode.

Я замінив UIKeyboardFrameBeginUserInfoKey на UIKeyboardFrameEndUserInfoKey, і це вирішило проблему для мене.


1
Я помітив те саме. Здається, це також стосується лише першого разу, коли клавіатура відображається. Клавіатури на додаткових контролерах перегляду повідомили про висоту як 0 при першому виявленні для цього контролера перегляду.
jackofallcode

5

Ця проблема трапляється на iOS 11.

Замінити

"UIKeyboardFrameBeginUserInfoKey" з "UIKeyboardFrameEndUserInfoKey"

як показано нижче, вирішить проблему

Код Objective-C:

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

Свіфт 2.3:

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

Свіфт 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
    }
}

1

Ваш підхід намагається отримати висоту кадру до того, як вона буде показана, і тому вона повинна бути 0, що я не впевнений, чому це не з першої спроби! Ось приклад того, як правильно отримати висоту клавіатури в швидкому 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
}

Це правильно забезпечить властивості рамки клавіатури ДО появи клавіатури.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.