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

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

Но в симуляторе iPhoneX вывод333 и симулятор iPhone 8258.

ВОПРОС: Если использовать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)
        } 
    }

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

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

Хорошо, с помощью @ Craig я обнаружил, что этот метод вызывается только 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, но если вы используете контейнер, это значение может отличаться, как у меня 22.0.

 zcui9326 сент. 2017 г., 10:41
Вы всегда можете использоватьrect.height рассчитать что осталось?
 holex26 сент. 2017 г., 10:31
в чем ваша проблема на самом деле? Вы спрашиваете о предположении, основанном на мнении в вашем вопросе.
 William Hu26 сент. 2017 г., 11:09
@ zcui93 Вы правы, я думаю, что для iPhone X высота прямоугольника больше не высота клавиатуры. Должен плюс нижняя часть.
 William Hu26 сент. 2017 г., 11:01
@ zcui93rect.height должна быть высота клавиатуры нормально.
 William Hu26 сент. 2017 г., 11:00
@holex Я отредактировал свой вопрос. Мой вопрос: я не могу получить правильную высоту клавиатурыrect.height из уведомления.

Ответы на вопрос(4)

Решение Вопроса

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

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

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

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

 William Hu26 сент. 2017 г., 18:15
Да, я думаю, что ты прав. «Вставка 34 пт», я пыталсяview.safeAreaInset как в iPhone 8, так и в iPhone X кажется все (0,0,0,0), как получить это значение?
 Craig Grummitt26 сент. 2017 г., 18:39
Если вы попробовали это вviewDidLoadПохоже, что это значение еще не установлено на данный момент. Вы можете переопределитьviewSafeAreaInsetsDidChange чтобы увидеть это значение:override func viewSafeAreaInsetsDidChange() { print(view.safeAreaInsets) }

Ответ Крейга правильно, вы можете не захотеть прикрепить свой взгляд наview.bottom илиbottomLayoutGuide а ненижняя безопасная зона (особенно если ваша клавиатура не всегда открыта, и вы не хотите, чтобы ваши взгляды покрывали область «Домашний индикатор»).

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

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

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

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

Пока это работает для всех устройств и версий 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];
}
 bpolat07 февр. 2019 г., 10:50
Просто прикрепите к Superview.Bottom ограничение. Не безопасная зона.

Ваш ответ на вопрос