2015-05-30 8 views
11

Ich habe einen Anmeldebildschirm mit reaktiven nativen erstellt.React-native, wie Bildschirm auf Textinput verschieben

Wie kann ich meinen Bildschirm nach oben verschieben, wenn der Benutzer den textInput eingibt?

Höre ich das onFocus() -Ereignis und verwende CSS-Styling, um den Stil der Ansicht zu ändern?

+0

Wir brauchen mehr Kontext/Code hier. –

+0

mögliches Duplikat von [Wie schiebe ich das Fenster automatisch von der Tastatur weg, wenn TextInput den Fokus hat?] (Http://stackoverflow.com/questions/29313244/how-to-auto-slide-the-window-out-from -behind-keyboard-when-textinput-has-focus) – Sherlock

+0

Vielleicht möchten Sie thick [this] (https://github.com/facebook/react-native/issues/3195#issuecomment-146568644) Github-Problem. Wir besprechen, wie wir das hier erreichen können. – amb

Antwort

6

Sie können ScrollView verwenden, um Bildschirmbewegungen nach oben und unten zu steuern. Solange der Benutzer keine TextInput fokussiert hat, können Sie disable scroll. Im Fokus schieben Sie einfach den Bildlauf mit Content Offset prop hoch.

<TextInput 
    onFocus={this.textInputFocused.bind(this)} 
    /> 

textInputFocused() { 
//do your stuff here. scroll screen up 
} 

Hoffe es hilft!

+1

funktioniert nicht auf Android – antoine129

3

Nachtwut Antwort ist ziemlich gut, wenn auch nicht mit dem contentOffset der Scroll Aufheben würde ich die ScrollResponder verwenden würde:

render() { 
    return (
    <ScrollView ref="myScrollView"> 
     <TextInput 
     ref="myInput" 
     onFocus={this._scrollToInput.bind(this)} 
     /> 
    </ScrollView> 
); 
} 

_scrollToInput { 
    const scrollResponder = this.refs.myScrollView.getScrollResponder(); 
    const inputHandle = React.findNodeHandle(this.refs.myInput) 

    scrollResponder.scrollResponderScrollNativeHandleToKeyboard(
    inputHandle, // The TextInput node handle 
    0, // The scroll view's bottom "contentInset" (default 0) 
    true // Prevent negative scrolling 
); 
} 

die Methodendefinition Siehe: scrollResponderScrollNativeHandleToKeyboard

+0

Dies wird auf getScrollResponder Büste Ich denke, das ist auf einer älteren Version der API gearbeitet. Ich benutze scrollTo und hart Code die Zahlen ist eine schreckliche Lösung und ich bin halb versucht, nur Webviews für Formularseiten zu verwenden. – aintnorest

+0

Es funktioniert gut, um den Bildschirm nach oben zu bewegen, was sollte ich verwenden, um den Bildschirm nach der Eingabe wieder nach unten zu bewegen? –

0

Und eine andere Lösung, Arbeits mit RN 0.2, anstatt den Inhalt zu zerquetschen, scrollt es.

inputFocused: function(ref) { 
    this._scroll(ref, 75); 
}, 

inputBlurred: function(ref) { 
    this._scroll(ref, 0); 
}, 

_scroll: function(ref, offset) { 
    setTimeout(() => { 
    var scrollResponder = this.refs.myScrollView.getScrollResponder(); 
    scrollResponder.scrollResponderScrollNativeHandleToKeyboard(
       React.findNodeHandle(this.refs[ref]), 
       offset, 
       true 
      ); 
    }); 
    }, 

...

render: function() { 
    return <View style={{flex: 1}}> 
    <ScrollView ref="myScrollView" keyboardDismissMode='interactive' contentContainerStyle={{flex: 1}}> 
     <TextInput 
     ref="myInput" 
     onFocus={this.inputFocused.bind(this, 'myInput')} 
     onBlur={this.inputBlurred.bind(this, 'myInput')} /> 
    </ScrollView> 
    </View> 
} 
0

Diese package hat eine greate Job, führt eine KeyboardAwareScrollView Komponente, die die Sicht auf Anpassung der Eingabe mit der Tastatur scrollt, dann wieder nach unten zu scrollen.

5

Im Jahr 2017 (RN 0,43) gibt es spezielle Komponente für diesen: KeyboardAvoidingView

+0

funktioniert nicht auf Android – farmcommand2

+0

@ farmcommand2 es funktioniert, aber mit einigen Hacks. Es gibt [Problem] (https://github.com/facebook/react-native/issues/11681#issuecomment-339446150) auf GitHub mit Lösungen. Ich benutze dieses: 'behavior = {(Platform.OS === 'ios')? 'padding': null} ' –

+0

Art von beschissen. Ich würde das Keyboard-Event eher selbst implementieren.so haben Sie wirklich Kontrolle über das Verhalten Ihres Layouts –

0

Es ist ein Mist zu schießen die native Tastatur Bewusstsein Funktionalität von Scroll zum Laufen zu bringen. Für meine Android-App funktioniert es perfekt in einem Bildschirm, der fast identisch ist wie der andere, der nicht funktioniert. Und auf iOS funktioniert es einfach nicht. Dies ist, was für mich funktioniert:

import { Keyboard, ScrollView, StyleSheet, View } from 'react-native'; 

this.state = { 
    filler: false, 
} 

componentWillMount() { 
    this.keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', this._keyboardDidShow.bind(this)); 
    this.keyboardDidHideListener = Keyboard.addListener('keyboardDidHide', this._keyboardDidHide.bind(this)); 
} 

componentWillUnmount() { 
    this.keyboardDidShowListener.remove(); 
    this.keyboardDidHideListener.remove(); 
} 

_keyboardDidShow() { 
    this.setState({filler: true}) 
    setTimeout(() => this.vertical && this.vertical.scrollToEnd({animated: true}), 0); 
} 

_keyboardDidHide() { 
    this.setState({filler: false}) 
} 


... 
return (
    <ScrollView ref={ref => this.vertical = ref}> 
    <TextInput/> 
    { this.state.filler ? <View style={styles.filler}/> : null } 
    </ScrollView> 
) 

styles.filler = { 
    height: 'Keyboard Height' 
} 

Hinweis: Dies kann nur funktionieren, wenn Ihr <TextInput/> am unteren Rand des Bildschirms ist, die es in meinem Fall war.

+1

Verwendung Pfeil-Funktion von es6, um die Bind-Methode zu vermeiden https://stackoverflow.com/questions/32192682/react-js-es6-avoid-binding-this-to-every -method Und Sie können es auch verbessern, indem Sie "keyboardWillShow" auf iOS implementieren. (ist nicht auf Android implementiert) –

+0

Ausgezeichnete Vorschläge. Ich bemerkte, dass der Antwortrahmen des TextInput, der über der Tastatur erschien, etwas zurücklag. Vielen Dank! – Progoogler

Verwandte Themen