2014-09-30 18 views
29

Ho problemi a ottenere in modo affidabile l'altezza effettiva della tastiera. Sto aggiungendo una barra degli strumenti personalizzata che deve essere posizionata direttamente sopra la tastiera. Per fare ciò con i vincoli di layout, ho aggiunto un vincolo di spazio statico tra la parte inferiore dello schermo e la parte inferiore della barra degli strumenti. Quando viene visualizzata la tastiera, a modificare questo vincolo di essere all'altezza della tastiera, che varia di parecchio in IOS 8.iOS 8 ottiene l'altezza della tastiera

Per ridimensionare il distanziatore, attualmente utilizzo il seguente metodo che viene generato sulla UIKeyboardDidShowNotification

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

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

Questo ridimensiona il vincolo correttamente a volte, ma spesso l'altezza della tastiera restituita è completamente errata. Qual è il modo migliore per ottenere in modo affidabile l'altezza della tastiera una volta visualizzata?

MODIFICA: L'applicazione consente all'utente di passare da un numero di campi di input diversi. Alcuni di essi hanno la correzione automatica disabilitata, quindi la barra di correzione automatica può o non può essere nascosta e all'altezza dei campi si restituiscono altezze errate.

+3

Non utilizzare keyboardDidShow ... Date un'occhiata a mia soluzione nel link: http : //stackoverflow.com/questions/26213681/ios-8-keyboard-hides-my-textview/26226732#26226732 –

risposta

35

Il modo in cui lo si sta facendo è corretto ma è possibile utilizzare UIKeyboardFrameEndUserInfoKey anziché UIKeyboardFrameBeginUserInfoKey. La chiave dell'utente finale è il fotogramma della tastiera quando viene eseguita l'animazione e sullo schermo, quindi sai che sarà quella cornice, mentre la chiave iniziale potrebbe non corrispondere sempre a quella che sarà la cornice della tastiera quando viene mostrata.

Potrebbe anche essere necessario prendere in considerazione ulteriori considerazioni sull'orientamento del dispositivo, non l'ho esaminato, ma per il ritratto dovrebbe funzionare.

+0

Purtroppo questo non ha fatto la differenza. Un'altra cosa da notare è che l'applicazione consente all'utente di passare da un numero di campi di input diversi. Alcuni di essi hanno la correzione automatica disabilitata, quindi la barra di correzione automatica può o non può essere nascosta. Sto ancora diventando altitudini errate quando si cambia campo ... – James

+2

ha funzionato per me. il mio requisito era quello di ottenere l'altezza in modo tale da aggiungere una barra di inserimento personalizzata su di essa. – harshitgupta

+0

Sembra non funzionare con barre degli strumenti/accessoriView. Vedi la mia domanda http://stackoverflow.com/questions/29947592/get-keyboard-size-on-ios-8-not-working-with-external-keyboard – Sunkas

0

Potrebbe essere necessario fare [self.view setNeedsLayout] anziché [self.view layoutIfNeeded].

7

Il modo corretto per eseguire questa operazione è utilizzare la proprietà inputAccesorryView di UITextField.

L'inputAccessoryView viene automaticamente aggiunto sopra la tastiera indipendentemente dalle dimensioni della tastiera.

Come afferma documentazione:

Il valore predefinito di questa proprietà è pari a zero. Assegnare una vista a questa proprietà fa sì che quella vista venga visualizzata sopra la tastiera di sistema standard (o sopra la vista di input personalizzata se ne viene fornita una) quando il campo di testo diventa il primo risponditore. Ad esempio, è possibile utilizzare questa proprietà per collegare una barra degli strumenti personalizzata alla tastiera

Tutte le informazioni qui https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/InputViews/InputViews.html

Problemi correlati