2012-05-25 16 views
12

Stiamo utilizzando PhoneGap per sviluppare la nostra applicazione per cellulare, e abbiamo preso in prestito il codice da qui per rimuovere il nero successivo/precedente/bar fatto da tastiera:PhoneGap: rimuovere completamente la barra nera dalla tastiera iPhone

https://stackoverflow.com/a/9276023/35364

Quello che fa il codice è che trova la barra nera, come oggetto UIView, e chiama "removeFromSuperview" su di esso.

Non abbiamo familiarità con l'SDK/API iOS. Quindi, mentre possiamo guardare il codice e avere un'idea di cosa sta facendo, non possiamo sapere se lo sta facendo correttamente, o come migliorarlo.

Il problema specifico stiamo correndo in:

Abbiamo un campo di testo per la scrittura di un messaggio, e stiamo controllando manualmente la collocazione di questo campo di essere esattamente sopra la tastiera, simile a quella nativa sms app. In altre parole, lo stiamo mettendo dove dovrebbe essere la barra nera.

Quando si mette a fuoco/digitare il campo del messaggio, il sistema spinge la vista verso l'alto. Sembra che questo sia un meccanismo per assicurarsi che il campo di testo non sia invisibile quando l'utente digita al suo interno.

Ciò accade anche se il campo di testo è visibile.

Ho notato che posizionando il campo di immissione proprio sopra la posizione in cui la barra nera sarebbe normalmente (come opposto al retro), la vista non scorre.

Quindi sembra che il sistema in qualche modo pensi che la barra nera sia ancora lì!

(Per ricontrollare: quando la barra nera non viene rimossa, e mettiamo il campo di testo proprio sopra di esso, possiamo mettere a fuoco e digitarci, e la vista non scorrerà).

Quindi la domanda è:

Perché il "sistema" push il contenuto quando si modifica un campo di testo che è giusto posto "dietro" in cui la barra nera dovrebbe essere? È perché la barra nera non è ancora completamente rimossa? Dobbiamo fare qualcosa per rimuovere "completamente" la barra nera? Dobbiamo forzare iOS a ricalcolare le dimensioni della tastiera? o cosa esattamente?

È questo meccanismo (che spinge verso l'alto la vista) implementato da UIWebView di iOS o da PhoneGap?

C'è qualche app per PhoneGap che ha risolto questo problema?

risposta

9

sostituire

[subviewWhichIsPossibleFormView removeFromSuperview]; 

con

UIScrollView *webScroll = [webView.subviews lastObject]; 
CGRect newFrame = webScroll.frame; 

float accesssoryHeight = subviewWhichIsPossibleFormView.frame.size.height; 
newFrame.size.height += accesssoryHeight; 

[subviewWhichIsPossibleFormView removeFromSuperview]; 
[webScroll setFrame:newFrame]; 

si ridimensiona la visualizzazione dei contenuti di scorrimento per la quantità di spazio accessorio mancante. È più lontano usare "API private" come l'altro codice. In dettaglio non sta usando direttamente l'API privata, ma se Apple decide di cambiare il modo in cui appare una vista (in questo caso Tastiera e WebView), si blocca.
Ad esempio se si rinomina UIWebFormAccessory, il codice non funzionerà più.

MODIFICA:
su iOS 5.0+ puoi chiamare direttamente webView.scrollView. Così si può dividere il codice per avere un pre iOS 5 ripiego:

UIScrollView *webScroll; 
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 5.0) { 
    webScroll = webView.scrollView; 
} else { 
    webScroll = [webView.subviews lastObject]; // iOS 2.x (?) - 4.x 
    // make sure this code runs appropriate on older SDKs 
} 
+0

Grazie, questo suona come potrebbe funzionare. Una cosa però non sono sicuro di cosa debba essere "webb". Ho provato 'UIScrollView * webScroll = [self.webView.subviews lastObject];' ma non sembra funzionare. – hasen

+0

ups sì, era la mia webView temporanea, un 'IBOutlet'. Ma dovrebbe funzionare come hai provato tu. Per favore 'NSLog (% @, self.webView.subviews)'. Forse hai più sottoview, ne ho avuto solo uno (la scrollView) –

+0

Penso che anche "self.webView.scrollView' dovrebbe funzionare. – hasen

0

questo ha funzionato per me: https://github.com/don/KeyboardToolbarRemover

Si dovrà conoscere, però, non c'è alcun file Cordova.plist come di PhoneGap 2.3. 0 - invece modificare il file XML di configurazione con il seguente:

<plugin name="KeyboardToolbarRemover" value="KeyboardToolbarRemover" /> 

nel ramo

Problemi correlati