Затем я использовал следующий код, keyboardOnScreen:чтобы получить доступ к рамке клавиатуры. Этот код получает userInfoсловарь из уведомления, а затем обращается к NSValueсвязанному с UIKeyboardFrameEndUserInfoKey. Затем вы можете получить доступ к CGRect и преобразовать его в координаты представления вашего контроллера представления. Оттуда вы можете выполнять любые необходимые вычисления на основе этого кадра.
Хотя это кажется немного сложным, это определенно лучше, чем жесткое программирование размера клавиатуры. Правильный ответ.
n13
2
Проголосовал за этот ответ и проголосовал против вопроса. ОП определенно не знает, о чем говорит. Будьте осторожны, ребята! Это правильный ответ!
superarts.org 04
2
одно дополнение для ландшафта: if (SYSTEM_VERSION_LESS_THAN (@ "8.0")) {_keyboardHeight = keyboardFrame.size.width; } еще {_keyboardHeight = keyboardFrame.size.height; }
LiangWang
3
Есть ли способ сделать это без появления клавиатуры? В моем случае я хочу, чтобы за клавиатурой было что-то такой же высоты (аналогично тому, как есть вещи в мессенджерах)
Джон
@ superarts.org Нет необходимости голосовать за вопрос; люди, скорее всего, будут искать это, и теперь они увидят этот ответ .. так что все хорошо :)
Ja͢ck
46
Помните, что в iOS 8 размер экранной клавиатуры может варьироваться. Не думайте, что экранная клавиатура всегда будет видна (с определенным высотой) или невидима.
Теперь, с iOS 8, пользователь также может включать и выключать область предсказания текста ... и когда они это делают, запускается приложение keyboardWillShow событие снова .
Это будет разорвать много образцов унаследованного кода, который рекомендуемое написавkeyboardWillShow событие, которое просто измеряет текущую высоту экранной клавиатуры, и меняющиеся элементы управления вверх или вниз на странице этого (абсолютной) суммой.
Другими словами, если вы видите какой-либо образец кода, который просто говорит вам добавить keyboardWillShowсобытие, измерить высоту клавиатуры, а затем изменить высоту ваших элементов управления на эту величину, это больше не всегда будет работать.
В моем примере выше я использовал образец кода со следующего сайта, который анимирует вертикальные ограничения. constant .
В моем приложении я добавил ограничение к своему UITextView , установленное в нижней части экрана. Когда экран впервые появился, я сохранил это начальное расстояние по вертикали.
Затем, когда мое keyboardWillShowмероприятие запускается, я добавляю (новую) высоту клавиатуры к этому исходному значению ограничения (чтобы ограничение изменяло размер высоты элемента управления).
Да уж. Это ужасно.
И меня немного раздражает / удивляет то, что ужасно болезненная AutoLayout XCode 6 не позволяет нам просто прикреплять нижнюю часть элементов управления либо к нижней части экрана, либо к верхней части экранной клавиатуры.
на самом деле размер клавиатуры всегда разный, даже в более старых версиях iOS. например, проверьте почерк на китайском языке
ReDetection
Ой, не осознавал этого. Мне просто показалось странным, что так много примеров «keyboardWillShow» всегда предполагали, что это событие будет вызвано только один раз, когда клавиатура появится или исчезнет ... без каких-либо функций, чтобы справиться с тем, чтобы клавиатура оставалась на экране, но меняла ее размер.
Майк Гледхилл
1
@MikeGledhill Я думаю, вы должны использовать «UIKeyboardWillChangeFrameNotification» для изменения кадра из-за поворота или отображения (/ скрытия) панели предсказания текста ...
Абдалрахман Шату
Я только что проверил это в своем приложении. UIKeyboardWillChangeFrameNotification всегда вызывается ASWELL КАК событие keyboardWillShow, когда я либо заставляю клавиатуру появляться, либо включаю или выключаю область предсказания текста. Так что это не особо помогает. Я хочу сказать ... пользователям нужно быть немного осторожнее с этими событиями, вот и все.
Майк Гледхилл
1
Почему этому не уделяется больше внимания?
rfoo 02 фев.15,
31
Высота клавиатуры 216 пунктов для портретного режима и 162 пунктов для ландшафтного режима.
Если вы собираетесь публиковать вопросы с самими ответами, по крайней мере, дайте достойные ответы. Размер клавиатуры должен быть получен из объекта уведомления, а не жестко заданного значения, взятого с какого-либо веб-сайта. Смотрите здесь
jrturton 01
16
@jrturton Вопрос не в том, как найти высоту программно. Этот вопрос полезен не только программистам, но и дизайнерам графики и т. Д. Ответ, который вы просите, относится к другому вопросу. Фактически, есть еще один вопрос с этим ответом: stackoverflow.com/a/7302291/310121
Эрик Б.
48
@ErikB Будь осторожен. Размер клавиатуры зависит от языка и типа клавиатуры.
Габриэль
13
Ради себя НИКОГДА не используйте жестко запрограммированное значение! В качестве яркого примера пользователь может использовать разделенную (состоящую из двух частей) клавиатуру, для которой высота не важна.
Timo
6
Этот ответ ленив и опасен. Пожалуйста, получите высоту клавиатуры из UIKeyboardDidShowNotification, поскольку фактическое значение имеет тенденцию меняться между версиями основного выпуска iOS. См. Ответ Кена ниже.
Александр
16
Примечание по версии: это больше не значение в iOS 9 и 10, поскольку они поддерживают настраиваемые размеры клавиатуры.
Я создал эту таблицу, в которой указаны высоты клавиатур iPhone и iPad, как для ландшафтного, так и для портретного режима, как с включенной, так и с отключенной панелью инструментов.
Я даже объяснил, как вы можете использовать эти параметры в своем коде здесь .
Обратите внимание, что вы должны использовать эти размеры только в том случае, если вам нужно знать размер клавиатуры перед компоновкой представления. В противном случае решения из других ответов работают лучше.
Ответы:
Я использовал следующий подход для определения рамки клавиатуры в 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
.Практика AutoLayout
В моем приложении я добавил ограничение к своему
UITextView
, установленное в нижней части экрана. Когда экран впервые появился, я сохранил это начальное расстояние по вертикали.Затем, когда мое
keyboardWillShow
мероприятие запускается, я добавляю (новую) высоту клавиатуры к этому исходному значению ограничения (чтобы ограничение изменяло размер высоты элемента управления).Да уж. Это ужасно.
И меня немного раздражает / удивляет то, что ужасно болезненная AutoLayout XCode 6 не позволяет нам просто прикреплять нижнюю часть элементов управления либо к нижней части экрана, либо к верхней части экранной клавиатуры.
Возможно, я что-то упускаю.
Кроме моего рассудка.
источник
Высота клавиатуры 216 пунктов для портретного режима и 162 пунктов для ландшафтного режима.
Источник
источник
Примечание по версии: это больше не значение в iOS 9 и 10, поскольку они поддерживают настраиваемые размеры клавиатуры.
Это зависит от модели и панели QuickType:
http://www.idev101.com/code/User_Interface/sizes.html
источник
Высота клавиатуры зависит от модели, панели 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, как для ландшафтного, так и для портретного режима, как с включенной, так и с отключенной панелью инструментов.
Я даже объяснил, как вы можете использовать эти параметры в своем коде здесь .
Обратите внимание, что вы должны использовать эти размеры только в том случае, если вам нужно знать размер клавиатуры перед компоновкой представления. В противном случае решения из других ответов работают лучше.
источник