[iPhone] UITextField がkeyboardで隠れないようにする

UITextFieldがスクリーンの下に配置された場合にKeyBoardで隠れてしまうことがあります。そのような場合はUIScrollViewを使って移動させれば解決ですね。

UITextField

Swift 5.1
Xcode 11.3.1

UITextFieldがKeyboardで隠れる

Androidであれば自動的にやってくれるのにと思うこともありますが、まあそれぞれコンセプトやらで違いがあるのは当然なのでしょう。逆にお互いに似通ったUIなどにすると「え〜っ」となりますので、勝手なもんです。

 

UIScrollView上にUITestFieldを設定する

基本的なUIScrollViewの使い方はこちらでやりました。今回はStoryBoardを使ってみます。

UIScrollViewをスクリーンにいっぱいに配置します。(後でコードで指定するのですが)

その上にUIImageView, UILabel, UITextField をそれぞれ配置
UILabelは背景を半透明の白にしてフォントを大きくして決めうちで「元気してる?」と入れました。



次はコードですが、こちらの基本的な内容を踏まえて、UIScrollViewの表示窓はスクリーンサイズにし、UIScrollViewの大きさをスクリーンの縦方向を2倍にしました。これで縦方向のみのスクロールになります。

ViewController.swift


これでStoryBoardの紐付けをそれぞれして起動してみます。



キーボードで隠れたので自分でスクロールさせて入力するところまでできました。
これを自動でやればいいのです、はい。

UIScrollViewを自動で移動させる

キーボードはUITextFieldを編集し始めると出現しますが、このタイミングで
UIRespomder.keyboardWillShowというNotificationが出ている訳です。

その情報をキャッチした後に、キーボードの上部とUITextFieldの底を調べて重なりを計算、重なっていた場合はUIScrollViewを移動させるというシナリオです。

viewWillAppearでNotificationCenterにkeyboardWillShowが現れるのをオブザーブさせます。
同様にKeyboardが隠れるケースkeyboardWillHideも監視させる。

viewWillDisappearではこれらを解放する処理も入れます。


上のSelectorで指定したfunctionを記述します。


50.0のオフセットを入れましたが状況に応じて変えてください

まとめのコード

以下まとめたものです。

ViewController.swift




スクロールできましたでしょうか

References:
How to make a UITextField move up when keyboard is present?
大きい画像を UIScrollView でスクロールする
TextField のキーボードを閉じる方法を3つ