UITextFieldをタップした時に画面をスクロールする

テキスト入力欄をタップした時に、テキストボックスが隠れないように画面をスクロールする方法。 これはUITextFieldを使う上で必須だと思うためメモ。

目次

何も設定しなかった場合の例

TextFieldを画面の下の方に設置するだけ。 そうすると、UITextFieldをタップした時に以下のようになります。 実行結果
タップ前 タップ後

UITextFieldのデリゲートメソッドを実装する

今回の目的は「UITextFieldをタップした時に画面をスクロールする」でしたね。 なので、UITextFieldタップされた時に呼び出されるメソッドを実装しましょう。 詳しくはUITextFieldのデリゲートメソッドの項目を参照してください。 それを実装したコードはこんな感じです。 実行すると、textFieldShouldBeginEditingメソッドに書いた処理が行われます。

キーボードが出現した時に処理を実行するメソッドを作る

次はキーボードが表示されたら呼び出されるメソッドを作ります。 キーボードはUITextFieldをタップすれば勝手に出てきますから… ここで使われるのがNSNotificationとkeyboardWillShowメソッドなどです。 NSNotificationに関してはこちらを参照してください。 要は、以下のように書いておくと、キーボードが表示されたときにkeyboardWillShowメソッドが呼ばれ、 キーボードが非表示になったときにkeyboardWillHideメソッドが呼ばれると言う感じです。

全体をスクロールする

さて、ここからが本題です。 UITextFieldをタップしてキーボードが表示されたら画面全体をスクロールしてあげます。 実装する手段は複数ありますが、今回はCGAffineTransformを使うことにします。 CGAffineTransformの詳細はこちらを参照してください。 以下の処理でどれくらい画面全体を移動させるかを引数に設定します。 今回、UITextFieldをタップした際、キーボードのすぐ上に位置するようにUITextFieldの下マージンをキーボードの高さから引いてあげます。 ここで注意なのは、引数に設定する座標の値は、画面の左上の座標を基準としていることです。 なので、キーボードが隠れて元に戻る場合は以下のように設定してあげます。 僕は始め、今の位置からどれくらい動かすかを引数に設定すると思っていました(^^; そして、移動させる設定をした後は、UIViewのクラスメソッドのanimateメソッドで、指定した時間で徐々に移動させていくと言う処理を実現させます。 以下の例だと、「0.3秒かけて指定した位置へ移動させる」という処理をしています。 animateメソッドに関してはこちらを参照してください。 クラスメソッドについてはこちら そして、それらを合わせた全体のコードが以下の通りになります。 実行結果
タップ前 タップ後