iOS の場合、キーボードが表示されてもアプリの画面サイズは変化しないため、画面下部の入力欄をタップすると、その要素がキーボードに隠れてしまうという現象が発生します。
スクロールすれば表示できますが、ちょっと面倒…ということで、入力欄にフォーカスが当たったタイミングで画面をスクロールするという処理を追加しました。
参考にしたサイトがあったのですが…リンクを保存し忘れました。
サンプルコードはこちら。
this.inputFocused = refName => {
const scrollResponder = this.refs.scrollView.getScrollResponder();
const inputHandle = ReactNative.findNodeHandle(this.refs[refName]);
scrollResponder.scrollResponderScrollNativeHandleToKeyboard (
inputHandle,
50,
true,
);
}
<ScrollView ref="scrollView">
......
<View ref='hobby'>
<TextInput
value={this.state.name}
onChangeText={value => this.setState({ name: value })}
onFocus={() => this.inputFocused('name')} />
</View>
......
</ScrollView>
this.inputFocused の 2、3 行目で、ScrollView と、入力欄の要素を取得し、ScrollView をその要素までスクロールさせています。
実際にスクロールを実行しているのは 4〜8行です。
scrollResponderScrollNativeHandleToKeyboard の引数には、それぞれ下記を指定します。
第1引数: 対象となる要素
第2引数: キーボードからどのくらい上にスクロールさせるかの offset
第3引数: マイナス方向へのスクロールを防ぐかどうか
なお、第2引数については、実際に動作させてみて調整するのがいいと思います。
個人的には 50 くらいがちょうどいいと思いましたが、ここはお好みで変更してください。
以上、React Native で入力欄にフォーカスが当たった際に要素が見える位置まで画面をスクロールする方法についてでした。
ご参考になれば幸いです。