jarinosuke blog

about software engineering, mostly about iOS

UIScrollViewKeyboardDismissMode について

出たままのキーボードをスクロールされたら良い感じに閉じる

iOS 純正アプリの Messages みたいなキーボードの挙動をやりたいなー、と調べていました。

どういう挙動かというと、

  • キーボードが出ている状態でスクロールダウンすると、それに伴ってキーボードも下がる
  • ドラッグしながら下げるのをやめて上にあげるとキーボードも戻ってくる

と、大変インタラクティブな挙動になっているのです。

まぁここまでやらなくとも、せめてスクロールビューへのドラッグなどのジェスチャーを検知して

キーボードを dismiss したいと思いました。

iOS 7 以前

iOS 7 より前では、簡単に実装するとすればスクロールビューに以下のようなことを

していてフックしていたかなと思い出しました。

  • UIGestureRecognizer をスクロールビューに付与してイベントを取得
  • UIScrollViewDelegate を受け取り、スクロールイベントを取得

上記のイベントをフックして、

[textField resignFirstResponder];

を実行していたかと思います。

これでも良いんですが、例えばiOS 純正アプリの Messagesインタラクティブ

なことをやろうとすると非常に手間で独自実装が増えてしまいます。

iOS 7

ここからようやく本題です。

タイトルにもある UIScrollViewKeyboardDismissMode という

APIiOS 7 から追加されています。

UIScrollView に keyboardDismissMode としてプロパティがあります。

デフォルトでは UIScrollViewKeyboardDismissModeNone が設定されているため、

  • インタラクティブしたいなら UIScrollViewKeyboardDismissModeInteractive
  • 単純にドラッグされた時にキーボードを消すだけなら UIScrollViewKeyboardDismissModeOnDrag

を設定するだけです。

iOS 7 からは、これだけでスクロール時のキーボード表示/非表示を行う事ができます。

参考

Text Programming Guide for iOS - Managing the Keyboard

Dismissing the keyboard in a UIScrollView