Web では、position: fixed; を使用しているときに似たような問題が起こりましたが、React Native でもこの問題からは逃れられないのですね…。
ということで、今回は React Native で開発した iOS アプリで入力欄にフォーカスされた際、その入力欄がソフトウェアキーボードの後ろに隠れてしまうときの対処方法についてです。
なんと、React Native では既にその対処のためのコンポーネントが用意されておりました!
使用するコンポーネントは <KeyboardAvoidingView /> です。
公式サイトの該当ページはこちら。
KeyboardAvoidingView · React Native
https://reactnative.dev/docs/keyboardavoidingview
使用方法は、該当ページの要素をマルっと <KeyboardAvoidingView /> で囲ってしまえばOKです!
サンプルコードは下記のとおりです。
import { Platform, KeyboardAvoidingView } from 'react-native';
import { getInset } from 'react-native-safe-area-view';
const bottomPadding = getInset('bottom', false);
const offset = bottomPadding > 0 ? 90 : 65;
<KeyboardAvoidingView
behavior={Platform.OS === "ios" ? "padding" : "height"}
style={{ flex: 1 }}
keyboardVerticalOffset={offset}>
......
</KeyboardAvoidingView>
サンプルコードで唐突に getInset を使って何かの値を計算していますが、まずこちらについて解説です。
KeyboardAvoidingView の keyboardVerticalOffset にこの値を指定していますが、このオプションは、端末の画面の上部と React Native ビューの間の距離を指定できるものらしいです。
デフォルト値は 0 なのですが、最初そのままでシミュレーターや実機で動作確認をしてみたところ、ページが若干キーボードの後ろに隠れてしまったのでそれの対策です。
また、ノッチのあり・なしに影響されるようで、ノッチありの場合は 90、ノッチなしの場合は 65 が丁度いいようでした。
勿論検証は必要ですが、多分そのまま使えると思いますので併せてご利用ください。
若干の微調整は必要でしたが、それ以外は全く問題なく動作しました!
キーボードの後ろに隠れてしまう不具合はこれで解決です。
以上、React Native の iOS アプリで入力欄がキーボードの後ろに隠れてしまう不具合の対処方法についてでした。
ご参考になれば幸いです。