Как получить высоту клавиатуры iOS 8.3 emoji?
Я могу обрабатывать два события: когда клавиатура показывает и когда скрывается клавиатура.
Все отлично работало в iOS 8.2 и старше.
Но как обрабатывать событие, когда вы меняете язык клавиатуры? Когда вы меняете английскую клавиатуру на клавиатуру emoji, высота клавиатуры emoji (в ios 8.3) больше и она скрывает содержимое.
Или, может быть, у вас есть решение, как управлять высотой клавиатуры iOS 8.3 emoji?
![enter image description here]()
Ответы
Ответ 1
OK. Поэтому, глядя на мой старый код, я вспомнил, что не использую 2 наблюдателя (UIKeyboardDidShowNotification
/UIKeyboardDidHideNotification
). Я использую одного наблюдателя (UIKeyboardWillChangeFrameNotification
), который запускается из каждого события: скрытие клавиатуры, отображение клавиатуры, смена клавиатуры.
В моем случае текстовое поле и кнопка отправки находятся в вложенном виде в UIView
, и это представление добавляется в view
из UIViewController
, поверх всего остального.
Я добавляю наблюдателя в viewDidAppear
и удаляю наблюдателя в viewWillDisappear
. (чтобы избежать срабатывания уведомления, когда представление неактивно).
Вышеприведенная информация не нужна для вашего дела, просто добавьте ее ради информации. Соответствующий код выглядит следующим образом:
ДОБАВИТЬ НАБЛЮДАТЕЛЬ:
- (void) viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
}
УВЕДОМЛЕНИЕ ОБ ОБРАБОТКЕ:
- (void) keyboardWillChangeFrame:(NSNotification*)notification {
NSDictionary* notificationInfo = [notification userInfo];
CGRect keyboardFrame = [[notificationInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
[UIView animateWithDuration:[[notificationInfo valueForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue]
delay:0
options:[[notificationInfo valueForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue]
animations:^{
CGRect frame = self.textViewContainer.frame;
frame.origin.y = keyboardFrame.origin.y - frame.size.height;
self.textViewContainer.frame = frame;
} completion:nil];
}
Вам может потребоваться внести несколько корректировок в строку frame.origin.y...
для правильных вычислений. Я не знаю, есть ли у вас UITabBarController
или любые столбцы внизу. Самая безопасная ставка здесь будет:
frame.origin.y = self.view.frame.size.height - keyboardFrame.size.height - X;
Где X
равно 0, если ваш VC покрывает весь экран. Если нет, используйте высоты любых нижних баров.
Ответ 2
У меня была та же проблема. Просто замените UIKeyboardFrameBeginUserInfoKey на UIKeyboardFrameEndUserInfoKey.: -)
Это сработало для меня.
Ответ 3
Стоит отметить, что клавиатура emoji имеет ту же самую высоту, что и стандартная клавиатура с предлагаемым текстом.
Чтобы правильно определить высоту клавиатуры и настроить вид, добавьте этих наблюдателей:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
Затем я использую следующие методы для анимации регулировки клавиатуры. На самом деле все, что вам нужно, это объект keyboardBounds
, но если вы используете AutoLayout, вот как вы это сделаете:
- (void)keyboardDidShow:(NSNotification *)notification
{
[self scrollControlBarTo:notification up:YES];
}
-(void)keyboardDidHide:(NSNotification *)notification
{
[self scrollControlBarTo:notification up:NO];
}
- (void)scrollControlBarTo:(NSNotification *)notification up:(BOOL)up
{
[_keyboardControlsBar layoutIfNeeded];
CGRect keyboardBounds;
NSDictionary *info = [notification userInfo];
NSNumber *number = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey];
double duration = [number doubleValue];
[[info objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardBounds];
UIViewAnimationCurve curve = [[info objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
[UIView animateWithDuration:duration
delay:0
options:UIViewAnimationOptionBeginFromCurrentState
animations:^{
[UIView setAnimationCurve:curve];
_keyboardControlsBarBottomConstraint.constant = (up) ? keyboardBounds.size.height : 0;
[self.view layoutIfNeeded];
} completion:nil];
}
Ответ 4
Код выше, но в быстром:
func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChangeFrame(_:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
}
...
func keyboardWillChangeFrame(_ notification: Notification?) {
let notificationInfo = notification?.userInfo
let keyboardFrame = notificationInfo?[UIResponder.keyboardFrameEndUserInfoKey]?.cgRectValue
UIView.animate(withDuration: TimeInterval((notificationInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.floatValue ?? 0.0), delay: 0, options: UIView.AnimationOptions(rawValue: (notificationInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber)?.intValue ?? 0), animations: {
let frame = self.textViewContainer.frame
frame.origin.y = (keyboardFrame?.origin.y ?? 0.0) - frame.size.height
self.textViewContainer.frame = frame
})
}