現在開発中のCordovaアプリで、iOS のソフトウェアキーボードを制御したくて導入したプラグイン「cordova-plugin-keyboard」についてのご紹介です。
開発中のアプリには、LINE のトーク画面のように入力欄が画面下にぴったり張り付いているようなレイアウトになっているのですが、文字を入力するとき、キーボードのサイズが若干変わったタイミングで、入力欄がキーボードの裏に隠れてしまう不具合が発生しました。
それの対処法として、今回紹介するプラグインを使いました。
なお、この現象が発生するのは iOS のみで、どうやら OS のバグが原因のようでした。
Android だと、全く問題なかったので、気づくのに遅れてしまいました…。
さて、では対処法ですが、まず導入したプラグインの GitHub はこちらから。
GitHub – cjpearson/cordova-plugin-keyboard: Keyboard Plugin for Cordova
https://github.com/cjpearson/cordova-plugin-keyboard
他にも、cordova-plugin-ionic-keyboard というよく似たプラグインもありましたが、私の実現したいことにはそぐわなかったので、こちらは使用しませんでした。
インストールは、下記のコマンドを実行してください。
cordova plugin add cordova-plugin-keyboard --save
インストールが終わったら、任意のメソッドを導入します。
私は下記の2つのメソッドを使いました。
- cordova.plugins.Keyboard.shrinkView
- cordova.plugins.Keyboard.disableScrollingInShrinkView
1つ目のメソッドは、キーボードが表示されたときに、WebView のサイズを縮小するかどうかを指定できます。
指定する方法は下記の通りです。
cordova.plugins.Keyboard.shrinkView(true);
true
を指定すると、キーボード出現時に WebView のサイズが縮み、スクロール可能になります。
false
だと、キーボードが表示されても WebView のサイズは変わりません。
というか、iOS の場合、こうして指定しないと、キーボードが表示されても WebView のサイズは変わらないんですね…。
それなら、レイアウトが崩れたのも納得です。
次に、キーボードが表示されている間、スクロールを許可するかどうかを指定できるメソッドです。
cordova.plugins.Keyboard.disableScrollingInShrinkView(true);
スクロールを無効にするためには、true
を指定します。
本当は、スクロールを有効にしたかったのですが、たまにレイアウトが崩れて謎の余白が発生したりするので、しぶしぶスクロールを禁止にしました。
レイアウト崩れがなんとかなりそうだったら、スクロール許可しようと思います。
なお、このメソッドは iOS しかサポートされていませんので、ご注意ください。
…でも、そもそも Android だと、これを使う必要もないので、これがあってもなくても特になんの影響もないんですけどね。
また、私の環境では、上記で紹介した書き方ではエラーが発生したので、下記のように書き直しました。
// 上記の記述でエラーが発生した場合、下記の記述に変更 window.Keyboard.shrinkView(true); window.Keyboard.disableScrollingInShrinkView(true);
この対応が正しいのかはわからないのですが、問題なく期待する動作をしたので、これでOKだと思います。
私が使ったメソッドはこの2つですが、他にも、キーボードが表示されているか検知できるプロパティや、キーボードが表示/非表示になったときに実行されるイベントもあります。
イベントには、キーボードが表示/非表示になる前に発火するものもあるので、状況に応じて使い分けてください。
以上、ソフトウェアキーボードを制御するためのプラグイン「cordova-plugin-keyboard」のご紹介でした。
Cordovaアプリ開発中に、iOS のソフトウェアキーボードに悩まされた方は、是非ご参考にしていただければと思います。