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

Как получить высоту клавиатуры iOS 8.3 emoji?

Я могу обрабатывать два события: когда клавиатура показывает и когда скрывается клавиатура. Все отлично работало в iOS 8.2 и старше.

Но как обрабатывать событие, когда вы меняете язык клавиатуры? Когда вы меняете английскую клавиатуру на клавиатуру emoji, высота клавиатуры emoji (в ios 8.3) больше и она скрывает содержимое.

Или, может быть, у вас есть решение, как управлять высотой клавиатуры iOS 8.3 emoji? enter image description here

4b9b3361

Ответ 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

    })
}