Ich habe diesen Hack für native Apps gesehen, um automatisch durch das Fenster zu scrollen, habe mich aber gefragt, wie ich es in React Native am besten machen kann ... Wenn ein <TextInput>
Feld scharf wird und tief in der Ansicht positioniert ist, verdeckt die Tastatur das Textfeld.
Sie können dieses Problem in der TextInputExample.js
Ansicht von UIExplorer sehen.
Hat jemand eine gute Lösung?
Antworten:
2017 Antwort
Das
KeyboardAvoidingView
ist wahrscheinlich der beste Weg, um jetzt zu gehen. Schauen Sie sich die Dokumente hier an . Es ist wirklich einfach im Vergleich zuKeyboard
Modulen, die Entwicklern mehr Kontrolle beim Ausführen von Animationen geben. Spencer Carli hat in seinem mittleren Blog alle möglichen Wege aufgezeigt .Antwort 2015
Die richtige Vorgehensweise
react-native
erfordert keine externen Bibliotheken, nutzt nativen Code und enthält Animationen.Definieren Sie zunächst eine Funktion, die das
onFocus
Ereignis für jedeTextInput
(oder jede andere Komponente, zu der Sie einen Bildlauf durchführen möchten) behandelt:Dann in Ihrer Renderfunktion:
Dies verwendet die
RCTDeviceEventEmitter
für Tastaturereignisse und die Größe, misst die Position der Komponente mithilfeRCTUIManager.measureLayout
und berechnet die genaue Bildlaufbewegung, die in erforderlich istscrollResponderInputMeasureAndScrollToKeyboard
.Möglicherweise möchten Sie mit dem
additionalOffset
Parameter herumspielen, um ihn an die Anforderungen Ihres spezifischen UI-Designs anzupassen.quelle
import {findNodeHandle} from 'react-native'
stackoverflow.com/questions/37626851/…Facebook Open Sourcing
KeyboardAvoidingView
in reagieren native 0.29, um dieses Problem zu lösen. Dokumentation und Anwendungsbeispiel finden Sie hier .quelle
DeviceEventEmitter.addListener('keyboardDidShow', this.keyboardDidShow.bind(this));
Wir haben einen Teil des Codeformulars "React-Native-Keyboard-Spacer" und den Code von @Sherlock kombiniert, um eine KeyboardHandler-Komponente zu erstellen, die mit TextInput-Elementen um jede Ansicht gewickelt werden kann. Klappt wunderbar! :-)
quelle
Zuerst müssen Sie React-Native-Keyboardevents installieren .
Dann zurück in Javascript Land:
Sie müssen die React-Native-Keyboardevents importieren.
Fügen Sie dann in Ihrer Ansicht einen Status für den Tastaturbereich hinzu und aktualisieren Sie ihn, nachdem Sie die Tastaturereignisse abgehört haben.
Fügen Sie Ihrer Renderfunktion schließlich unter allem einen Abstandshalter hinzu, damit Ihre Inhalte bei zunehmender Größe beschädigt werden.
Es ist auch möglich, die Animations-API zu verwenden, aber der Einfachheit halber passen wir sie einfach nach der Animation an.
quelle
this.listView.getScrollResponder().scrollTo(rowID * rowHeight);
Dies wird im TextInput einer Zeile aufgerufen, wenn ein onFocus-Ereignis empfangen wird.React-Native-Keyboard-Aware-Scroll-View löste das Problem für mich. React-Native-Keyboard-Aware-Scroll-Ansicht auf GitHub
quelle
Versuche dies:
...
...
...
...
...
Es hat bei mir funktioniert. Die Ansicht wird grundsätzlich verkleinert, wenn die Tastatur angezeigt wird, und wächst wieder nach, wenn sie ausgeblendet ist.
quelle
Ich wollte nur erwähnen, jetzt gibt es eine
KeyboardAvoidingView
in RN. Importieren Sie es einfach und verwenden Sie es wie jedes andere Modul in RN.Hier ist der Link zum Commit für RN:
https://github.com/facebook/react-native/commit/8b78846a9501ef9c5ce9d1e18ee104bfae76af2e
Es ist ab 0.29.0 verfügbar
Sie haben auch ein Beispiel für UIExplorer aufgenommen.
quelle
Vielleicht ist es zu spät, aber die beste Lösung ist die Verwendung einer nativen Bibliothek, IQKeyboardManager
Ziehen Sie das IQKeyboardManager-Verzeichnis einfach per Drag & Drop aus dem Demo-Projekt in Ihr iOS-Projekt. Das ist es. Sie können auch einen Wert festlegen, wenn isToolbar aktiviert ist, oder den Abstand zwischen Texteingabe und Tastatur in der Datei AppDelegate.m. Weitere Details zur Anpassung finden Sie auf dem GitHub-Seitenlink, den ich hinzugefügt habe.
quelle
Ich habe TextInput.onFocus und ScrollView.scrollTo verwendet.
quelle
@ Stephen
Wenn es Ihnen nichts ausmacht, wenn die Höhe nicht genau mit der Geschwindigkeit animiert wird, mit der die Tastatur angezeigt wird, können Sie einfach LayoutAnimation verwenden, damit zumindest die Höhe nicht an ihren Platz springt. z.B
Importieren Sie LayoutAnimation aus React-Native und fügen Sie Ihrer Komponente die folgenden Methoden hinzu.
Einige Beispielanimationen sind (ich verwende die Feder oben):
AKTUALISIEREN:
Siehe die Antwort von @ sherlock weiter unten. Ab reaktionsfähigem 0.11 kann die Größenänderung der Tastatur mithilfe der integrierten Funktionalität gelöst werden.
quelle
Sie können einige der Methoden zu etwas Einfacherem kombinieren.
Schließen Sie einen onFocus-Listener an Ihre Eingänge an
Unsere Scroll-Down-Methode sieht ungefähr so aus:
Dies weist unsere Bildlaufansicht (denken Sie daran, einen Verweis hinzuzufügen) an, bis zur Position unserer fokussierten Eingabe zu scrollen - 200 (es entspricht ungefähr der Größe der Tastatur).
Hier setzen wir unsere Bildlaufansicht wieder nach oben zurück,
quelle
Ich verwende eine einfachere Methode, aber sie ist noch nicht animiert. Ich habe einen Komponentenstatus namens "dumpedUp", den ich standardmäßig auf 0 setze, aber auf 1 setze, wenn der textInput den Fokus erhält, wie folgt:
Auf meinem textInput:
Ich habe auch einen Stil, der dem Verpackungsbehälter von allem auf diesem Bildschirm einen unteren Rand und einen negativen oberen Rand gibt, wie folgt:
Und dann habe ich auf dem Verpackungsbehälter die Stile wie folgt eingestellt:
Wenn also der Status "dumpedUp" auf 1 gesetzt wird, wird der Bumpedcontainer-Stil aktiviert und der Inhalt nach oben verschoben.
Ein bisschen hacky und die Ränder sind hartcodiert, aber es funktioniert :)
quelle
Ich benutze brysgo answer, um den unteren Rand meiner Bildlaufansicht anzuheben. Dann verwende ich den onScroll, um die aktuelle Position der Bildlaufansicht zu aktualisieren. Ich fand dann diese React Native: Die Position eines Elements ermitteln , um die Position der Texteingabe zu ermitteln. Ich rechne dann einfach nach, um herauszufinden, ob sich die Eingabe in der aktuellen Ansicht befindet. Dann benutze ich scrollTo, um den Mindestbetrag plus einen Rand zu verschieben. Es ist ziemlich glatt. Hier ist der Code für den Bildlaufabschnitt:
quelle
Ich treffe auch diese Frage. Schließlich löse ich es, indem ich die Höhe jeder Szene definiere, wie zum Beispiel:
Außerdem verwende ich ein Drittanbieter-Modul https://github.com/jaysoo/react-native-extra-dimensions-android , um die tatsächliche Höhe zu ermitteln.
quelle