Высота в портретной ориентации и высота в альбомной ориентации измеряется в точках.
Высота в портретной ориентации и высота в альбомной ориентации измеряется в точках.
Ответы:
Я использовал следующий подход для определения рамки клавиатуры в iOS 7.1.
В методе инициализации моего контроллера представления я зарегистрировался для UIKeyboardDidShowNotification
:
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(keyboardOnScreen:) name:UIKeyboardDidShowNotification object:nil];
Затем я использовал следующий код, keyboardOnScreen:
чтобы получить доступ к рамке клавиатуры. Этот код получает userInfo
словарь из уведомления, а затем обращается к NSValue
связанному с UIKeyboardFrameEndUserInfoKey
. Затем вы можете получить доступ к CGRect и преобразовать его в координаты представления вашего контроллера представления. Оттуда вы можете выполнять любые необходимые вычисления на основе этого кадра.
-(void)keyboardOnScreen:(NSNotification *)notification
{
NSDictionary *info = notification.userInfo;
NSValue *value = info[UIKeyboardFrameEndUserInfoKey];
CGRect rawFrame = [value CGRectValue];
CGRect keyboardFrame = [self.view convertRect:rawFrame fromView:nil];
NSLog(@"keyboardFrame: %@", NSStringFromCGRect(keyboardFrame));
}
Swift
И эквивалентная реализация со Swift:
NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow), name: UIResponder.keyboardDidShowNotification, object: nil)
@objc
func keyboardDidShow(notification: Notification) {
guard let info = notification.userInfo else { return }
guard let frameInfo = info[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }
let keyboardFrame = frameInfo.cgRectValue
print("keyboardFrame: \(keyboardFrame)")
}
Помните, что в iOS 8 размер экранной клавиатуры может варьироваться. Не думайте, что экранная клавиатура всегда будет видна (с определенным высотой) или невидима.
Теперь, с iOS 8, пользователь также может включать и выключать область предсказания текста ... и когда они это делают, запускается приложение keyboardWillShow
событие снова .
Это будет разорвать много образцов унаследованного кода, который рекомендуемое написавkeyboardWillShow
событие, которое просто измеряет текущую высоту экранной клавиатуры, и меняющиеся элементы управления вверх или вниз на странице этого (абсолютной) суммой.
Другими словами, если вы видите какой-либо образец кода, который просто говорит вам добавить keyboardWillShow
событие, измерить высоту клавиатуры, а затем изменить высоту ваших элементов управления на эту величину, это больше не всегда будет работать.
В моем примере выше я использовал образец кода со следующего сайта, который анимирует вертикальные ограничения. constant
.
В моем приложении я добавил ограничение к своему UITextView
, установленное в нижней части экрана. Когда экран впервые появился, я сохранил это начальное расстояние по вертикали.
Затем, когда мое keyboardWillShow
мероприятие запускается, я добавляю (новую) высоту клавиатуры к этому исходному значению ограничения (чтобы ограничение изменяло размер высоты элемента управления).
Да уж. Это ужасно.
И меня немного раздражает / удивляет то, что ужасно болезненная AutoLayout XCode 6 не позволяет нам просто прикреплять нижнюю часть элементов управления либо к нижней части экрана, либо к верхней части экранной клавиатуры.
Возможно, я что-то упускаю.
Кроме моего рассудка.
Высота клавиатуры 216 пунктов для портретного режима и 162 пунктов для ландшафтного режима.
Примечание по версии: это больше не значение в iOS 9 и 10, поскольку они поддерживают настраиваемые размеры клавиатуры.
Это зависит от модели и панели QuickType:
Высота клавиатуры зависит от модели, панели QuickType, пользовательских настроек ... Лучше всего рассчитать динамически:
Swift 3.0
var heightKeyboard : CGFloat?
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardShown(notification:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
}
func keyboardShown(notification: NSNotification) {
if let infoKey = notification.userInfo?[UIKeyboardFrameEndUserInfoKey],
let rawFrame = (infoKey as AnyObject).cgRectValue {
let keyboardFrame = view.convert(rawFrame, from: nil)
self.heightKeyboard = keyboardFrame.size.height
// Now is stored in your heightKeyboard variable
}
}
Я не могу найти последний ответ, поэтому проверяю все с помощью симулятора (iOS 11.0)
Устройство | Высота экрана | Портрет | Пейзаж
iPhone 4s | 480,0 | 216,0 | 162,0
iPhone 5, iPhone 5s, iPhone SE | 568,0 | 216,0 | 162,0
iPhone 6, iPhone 6s, iPhone 7, iPhone 8, iPhone X | 667.0 | 216,0 | 162,0
iPhone 6 плюс, iPhone 7 плюс, iPhone 8 плюс | 736,0 | 226,0 | 162,0
iPad 5-го поколения, iPad Air, iPad Air 2, iPad Pro 9.7, iPad Pro 10.5, iPad Pro 12.9 | 1024.0 | 265,0 | 353,0
Благодаря!
iPhone
Размеры клавиатуры:
2.6S, 6,7,8: (375 × 667): keyboardSize = (0.0, 407.0, 375.0, 260.
3.6 +, 6S +, 7+, 8+: (414 × 736) размер клавиатуры = (0.0, 465.0, 414.0, 271.0)
4. XS, X: (375 X 812) Размер клавиатуры = (0,0, 477,0, 375,0, 335,0)
5.XR, XSMAX ((414 x 896) размер клавиатуры = (0,0, 550,0, 414,0, 346,0)
Я создал эту таблицу, в которой указаны высоты клавиатур iPhone и iPad, как для ландшафтного, так и для портретного режима, как с включенной, так и с отключенной панелью инструментов.
Я даже объяснил, как вы можете использовать эти параметры в своем коде здесь .
Обратите внимание, что вы должны использовать эти размеры только в том случае, если вам нужно знать размер клавиатуры перед компоновкой представления. В противном случае решения из других ответов работают лучше.