Подтвердить что ты не робот

IOS 8 получают высоту клавиатуры

У меня возникли проблемы с надежностью получения фактической высоты клавиатуры. Я добавляю настраиваемую панель инструментов, предназначенную для размещения непосредственно над клавиатурой. Чтобы сделать это с ограничениями макета, я добавил ограничение статического пространства между нижней частью экрана и нижней частью панели инструментов. Когда клавиатура отображается, я изменяю это ограничение как высоту клавиатуры, которая немного меняется в iOS 8.

Чтобы изменить размер проставки, в настоящее время я использую следующий метод, который запускается на UIKeyboardDidShowNotification

-(void)keyboardDidShow:(NSNotification*)notification
{
   CGFloat height = [[notification.userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].height;

   self.shimConstraint.constant = height;
   [self.view layoutIfNeeded];
}

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

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

4b9b3361

Ответ 1

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

Также могут потребоваться дополнительные соображения относительно ориентации устройства, я не смотрел на это, но для портрета он должен работать.

Ответ 2

Правильный способ сделать это - использовать свойство inputAccesorryView UITextField.

InputAccessoryView автоматически добавляется над клавиатурой независимо от размера клавиатуры.

Как указано в документации:

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

Подробнее см. здесь https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/InputViews/InputViews.html

Ответ 3

Вам может понадобиться [self.view setNeedsLayout] вместо [self.view layoutIfNeeded].