Высота клавиатуры 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)
}
}
Как и этот образ, зеленая граница должна быть дополнительной. На самом деле, мне нужна красная часть только на верхней части клавиатуры без зеленого прямоугольника.
РЕДАКТИРОВАТЬ
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
:
Если вы хотите поделиться своим кодом/ограничениями для позиционирования красного представления, я смогу показать вам проблему.
--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()
}
}