2015-04-28 5 views
12

Posso gestire due eventi: quando la tastiera mostra e quando la tastiera si nasconde. Tutto ha funzionato bene su iOS 8.2 e precedenti.Come ottenere l'altezza della tastiera emoji iOS 8.3?

Ma come gestire l'evento quando si modifica la lingua della tastiera? Quando si cambia la tastiera inglese sulla tastiera delle emoji, l'altezza della tastiera delle emoji (in ios 8.3) è più grande e nasconde il contenuto.

O forse hai una soluzione su come controllare l'altezza della tastiera emoji iOS 8.3? enter image description here

+3

Controllare 'UIKeyboardWillChangeFrameNotification' /' UIKeyboardDidChangeFrameNotification'.Questi vengono attivati ​​ogni volta che cambia la cornice della tastiera, indipendentemente dal fatto che la tastiera si nasconda o no. Ad esempio, cambiando i tipi di tastiera (ascii/emoji) o attivando la barra di testo predittivo sopra la tastiera. – n00bProgrammer

+0

non funziona ... – Albert

+0

OK. Lascia che aggiorni il mio Xcode e i simulatori e ti darò una soluzione di lavoro ottimizzata. Dammi un'ora o così. – n00bProgrammer

risposta

4

Vale la pena notare che la tastiera delle emoji è la stessa altezza della tastiera standard con testo suggerito abilitato.

Per determinare correttamente l'altezza della tastiera e regolare la visualizzazione, aggiungere questi osservatori:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil]; 

Poi ho utilizzare i seguenti metodi per animare la regolazione della tastiera. Davvero tutto ciò che serve è l'oggetto keyboardBounds, ma se vi capita di essere utilizzando layout automatico, questo è come lo faresti:

- (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

È possibile determinare anche l'ora di animazione della tastiera ?? Sarebbe il perfetto! –

+0

http://stackoverflow.com/questions/1419221/what-is-the-iphones-default-keyboard-animation-rate - aggiornato la mia risposta per includere i bit rilevanti. – brandonscript

+1

Vedi http://stackoverflow.com/questions/18957476/ios-7-keyboard-animation per la discussione sulla curva di animazione non documentata di iOS 7 per le animazioni della tastiera. – jszumski

12

OK. Quindi, guardando il mio vecchio codice, mi sono ricordato, I non utilizzare 2 osservatori (UIKeyboardDidShowNotification/UIKeyboardDidHideNotification). Uso un singolo osservatore (UIKeyboardWillChangeFrameNotification), che viene attivato da ciascun evento: Nascondere la tastiera, mostrare la tastiera, cambiare la cornice della tastiera.

Nel mio caso, la casella di testo e il pulsante invio sono in annidato in un UIView e questo è vista viene aggiunto nel view del UIViewController, sopra ogni altra cosa.

Aggiungere l'osservatore in viewDidAppear e rimuovere l'osservatore in viewWillDisappear. (Per evitare l'attivazione di notifiche quando la vista non è attiva).

Le informazioni di cui sopra non sono necessarie per il tuo caso, è stato aggiunto per motivi di informazione. codice rilevante è il seguente:

ADD OSSERVATORE:

- (void) viewDidAppear:(BOOL)animated { 

    [super viewDidAppear:animated]; 

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

MANICO DI NOTIFICA:

- (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]; 
} 

Potrebbe essere necessario fare qualche aggiustamento alla linea frame.origin.y... per i calcoli corretti. Non so se hai uno UITabBarController o una barra in fondo. La scommessa più sicura qui sarebbe:

frame.origin.y = self.view.frame.size.height - keyboardFrame.size.height - X; 

Dove X è 0 se il VC copre l'intero schermo. In caso contrario, utilizzare le altezze di eventuali barre in basso.

+0

l'animazione non insieme con il layout automatico ... – holex

+0

I vincoli di layout dovranno essere aggiornati in quel caso. – n00bProgrammer

+0

Mentre remus ha fornito anche una risposta corretta, questa è corretta e più facile da implementare/meno codice. Funziona perfettamente. – user3344977

6

Ho avuto lo stesso problema. Basta sostituire UIKeyboardFrameBeginUserInfoKey con UIKeyboardFrameEndUserInfoKey. :-)

Ha funzionato per me.

+0

Ha funzionato anche per me ... grazie –