2015-04-28 8 views
12

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

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

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

+3

Проверка 'UIKeyboardWillChangeFrameNotification' /' UIKeyboardDidChangeFrameNotification'.Они запускаются каждый раз, когда меняется рамка клавиатуры, независимо от того, скрыта ли клавиатура или нет. Например, изменение типов клавиатуры (ascii/emoji) или переключение интеллектуального текстового столбца над клавиатурой. – n00bProgrammer

+0

нерабочий .... – Albert

+0

OK. Позвольте мне обновить Xcode и симуляторы, и я дам вам оптимизированное рабочее решение. Дайте мне час или около того. – n00bProgrammer

ответ

4

Следует отметить, что клавиатура 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]; 
} 
+0

Можно ли также определить время анимации клавиатуры? Это было бы прекрасно! –

+0

http://stackoverflow.com/questions/1419221/what-is-the-iphones-default-keyboard-animation-rate - обновил мой ответ, включив соответствующие биты. – brandonscript

+1

См. Http://stackoverflow.com/questions/18957476/ios-7-keyboard-animation для обсуждения недокументированной анимационной кривой iOS 7 для анимации клавиатуры. – jszumski

12

OK. Поэтому, глядя на мой старый код, я вспомнил, что я не знаю использовать 2 наблюдателя (UIKeyboardDidShowNotification/UIKeyboardDidHideNotification). Я использую одного наблюдателя (UIKeyboardWillChangeFrameNotification), который запускается из каждого события: скрытие клавиатуры, отображение клавиатуры, смена клавиатуры.

В моем случае, текстовое поле и кнопка посыла в вложен в UIView и это вид добавляется в view в UIViewController, выше всего остального.

Я добавляю наблюдателя в viewDidAppear и удаляю наблюдателя в viewWillDisappear. (Во избежание срабатывания уведомления, когда просмотр неактивен).

Вышеприведенная информация не требуется для вашего случая, просто добавьте ее для информации. Соответствующий код выглядит следующим образом:

ADD НАБЛЮДАТЕЛЕМ:

- (void) viewDidAppear:(BOOL)animated { 

    [super viewDidAppear:animated]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil]; 
} 

HANDLE УВЕДОМЛЕНИЕ:

- (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 охватывает весь экран. Если нет, используйте высоты любых нижних баров.

+0

анимация не будет вместе с автоматической компоновкой ... – holex

+0

В этом случае ограничения макета потребуют обновления. – n00bProgrammer

+0

Хотя remus также предоставил правильный ответ, этот правильный и простой в использовании/уменьшенный код. Работает отлично. – user3344977

6

У меня была та же проблема. Просто замените UIKeyboardFrameBeginUserInfoKey на UIKeyboardFrameEndUserInfoKey. :-)

Это сработало для меня.

+0

Это сработало и для меня. –

Смежные вопросы