Высота клавиатуры iPhone и iPhone 8 различна

Я использую ниже код, чтобы получить высоту клавиатуры. Затем используйте эту высоту, чтобы рассчитать фрейм UIView чтобы убедиться, что этот UIView только на верхней части клавиатуры.

Но в симуляторе iPhoneX выход составляет 333 а симулятор iPhone 8 - 258.

ВОПРОС: Если вы используете rect.height в качестве высоты клавиатуры для симулятора iPhone 8, то макет верен. Для iPhone X есть пробел между UIView и клавиатурой. Что означает, что 333 выше реальной высоты клавиатуры в iPhone X.

Какова причина разницы? И как получить правильную высоту клавиатуры?

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)


@objc func keyboardWillShow(_ notification: NSNotification) {
        if let rect = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
           print(rect.height)
        } 
    }

Как и этот образ, зеленая граница должна быть дополнительной. На самом деле, мне нужна красная часть только на верхней части клавиатуры без зеленого прямоугольника. enter image description here

РЕДАКТИРОВАТЬ

OK, с помощью @Craig help, я нашел этот метод, только вызываемый iPhone X. Поэтому я обновляю фрейм здесь. Просто вставьте код здесь.

Высота нижнего уровня безопасной зоны 22.0 кажется неправильной.

override func viewSafeAreaInsetsDidChange() {
    if #available(iOS 11.0, *) {
        super.viewSafeAreaInsetsDidChange()
        view.safeAreaInsets.bottom // This value is the bottom safe area place value.
    }
}

EDIT2 Обычно view.safeAreaInsets.bottom должен быть 34.0, но если вы используете представление контейнера, это значение может быть другим, например my 22.0.

Ответы

Ответ 1

Высота клавиатуры для iPhone X и iPhone 8 должна быть правильной. Я могу только догадываться, что, возможно, у вас есть проблема в вашем коде для определения "красной части", и вы предполагали, что высота клавиатуры была неправильной, тогда как проблема была на самом деле в расположении вида. Теперь - причина проблемы с расположением? Мое второе предположение заключается в том, что красная часть прикреплена к руководству по расположению нижней безопасной зоны, которое на iPhone 8 равно 0, а на iPhone X вставлено 34 очка.

Посмотрите на это изображение, чтобы проиллюстрировать разницу в высоте клавиатуры и то, что можно нарисовать прямоangularьник чуть выше клавиатуры, используя высоту клавиатуры от высоты клавиатуры, указанной в NSNotification для метода keyboardWillShow:

enter image description here

Если вы хотите поделиться своим кодом/ограничениями для позиционирования красного представления, я смогу показать вам проблему.

--Edit: Для тех, кому интересно узнать, как я извлекаю нарисованный красный прямоangularьник, я вхожу в него в блоге здесь.

Ответ 2

Хотя ответ Крэйга правильный, вы можете не захотеть привязать свой вид к view.bottom или bottomLayoutGuide, а не к нижней части безопасного места (особенно если ваша клавиатура не всегда открыта, и вы не хотите, чтобы ваши взгляды отображали Home Indicator площадь).

Вот исправление для этих случаев. Он вычитает высоту нижней вставки безопасной области с высоты клавиатуры:

var keyboardHeight = ... // Get the keyboard height from keyboard notification

if #available(iOS 11.0, *) {
    let bottomInset = view.safeAreaInsets.bottom
    keyboardHeight -= bottomInset
}

Ответ 3

Пока что это работает для всех устройств и версий iOS

- (void)keyboardWillShown:(NSNotification*)aNotification
{
        NSDictionary* info = [aNotification userInfo];
        CGFloat kbHeight = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;
        CGFloat safeAreaBottomInset = 0;
        if (@available(iOS 11.0, *)) {
            safeAreaBottomInset = self.view.safeAreaInsets.bottom;
        }
        self.containerViewBottomConstraint.constant += (kbHeight - safeAreaBottomInset); //In my case I use a constraint to adapt the UI when the keyboard is presented
        [self.view layoutIfNeeded];
}

Ответ 4

Я тоже столкнулся с этой проблемой. Что я сделал, просто проверяю клавиатуру, которая отличается на iPhone 7 и iPhone X. Я просто добавляю поле по умолчанию с высотой клавиатуры. Теперь он работает нормально на каждом устройстве.

Ответ 5

переопределить func viewDidLoad() {       super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
//Here keyboard is without any toolbar and suggestions boxes
@objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        let keyboardHeight = ((keyboardSize.height) > 240) ? 220 :  (keyboardSize.height - 47)
        self.view.layoutIfNeeded()
    }

}