iOS – ソフトウェアキーボードを非表示にする(応用編)

概要
テキストフィールドをタップしたときに、下からにゅると表示されるソフトウェアキーボード。入力中のテキストフィールド以外の場所がタップされたときにそのソフトウェアキーボードを非表示にする方法を紹介します。そんなに難しくないです。簡単です。

ポイント

  • iOSのソフトウェアキーボードは入力中のテキストフィールドやテキストエリアに対して、resignFirstResponderメソッドを実行することで非表示にすることができます。
  • テキストフィールド以外の場所がタップされたどうかは透明なボタンを使って検知します。

方法
下図のようにテキストフィールドやラベル、ボタンがある場合で解説します。
想定する状況

 

これに加えて、画面と同じ大きさの透明なボタンを用意します。ボタンの透明化はボタンのTypeをCustomにするこで実現できます。
透明なボタンを追加

 

さらにこの透明ボタンが最下層に配置されるように、ボタンを選択した状態でメニューバーから「Editor」→「Arrange」→「Send to Back」を選択して並び替えを行います。こうすることで既存のテキストフィールドや保存ボタンがタップで選択できるようになり、それ以外の場所がタップされたときにこの透明ボタンが反応するようになります。
ボタンを最下層に配置する

 

次にhideKeyboardメソッドを作成し(メソッド名はなんでもいいです)、そのメソッドが透明なボタンがタップされたときに呼び出されるようにイベント登録をします。この作業は下図のようにInterface Builder上でボタンをControlキーを押しながら当該ViewControllerの@interfaceブロックにドラック&ドロップすることで簡単に完了します。
Interface Builderからドラッグ&ドロップでイベント登録

 

最後に追加されたhideKeyboardメソッドを以下のように実装します。ファーストレスポンダに対してresignFirstResponderメソッドを実行する、という基本は変わりません。ただ、どのオブジェクトがFirstResponderになっているかわからないので、当該ビューにあるすべてのオブジェクトにFirstResponderであるか問い合わせをして、FirstResponderであればresignFirstResponderメソッドを実行しています。

- (IBAction)hideKeyboard:(id)sender {

    // ファーストレスポンダになっているものをしらみつぶしに探して、ファーストレスポンダをやめさせることで
    // ソフトウェアキーボードを非表示にする
    for (UIView *view in [self.view subviews]){
		if ([view isFirstResponder] ) {
			[view resignFirstResponder];
		}
	}
}

 

まとめ

  1. 透明なボタンを追加する
  2. 透明なボタンを最下層に配置する
  3. 透明なボタンがタップされたときにメソッドが呼び出されるようにする
  4. 呼び出されたメソッド内でFirstResponderを探し当て、 resignFirstResponderを実行する

環境
iOS5 & iOS6
XCode 4.5.2

関連項目
iOS – ソフトウェアキーボードを非表示にする(基本編) - returnキーや改行キーが押されたときにソフトウェアキーボードを非表示にする方法を解説