【iOS】キーボードの開閉に応じて TextField の高さを自動で移動してくれる IQKeyboardManager ライブラリ【Swift】
目次
IQKeyboardManager ライブラリ
iOSアプリでは TextField をタップすると、キーボードが下からニュルッと伸びてきます。
この際に、TextField の位置が画面の上側にあれば何も気にする必要はないですが、
下に配置していると入力エリアが隠れてしまいます。
このようなケースでは、本来ならプログラマがテキストフィールドの位置を自分で制御してあげる必要がありますが、この処理は意外と実装が面倒です。。
「テキストフィールドが隠れてしまう時は自動で位置を移動させたい・・・」
こんなプログラマのワガママを叶えてくれるライブラリが、「IQKeyboardManager」です。
このライブラリをプロジェクトに導入し、いくつかのプロパティを指定してあげるだけで、
テキストフィールドがちょうど見えやすい位置になるよう自動で制御されます。
本記事ではライブラリの導入手順と、
導入にあたっていくつかつまずいたポイントがあったため、その辺りを共有しております。
ライブラリ導入
ライブラリのリポジトリはこちらです。
ここではライブラリ管理ツールに Carthage を使っています。
Cartfile
1 |
github "hackiftekhar/IQKeyboardManager" |
ライブラリをビルド
1 |
$ carthage update --platform ios --use-xcframeworks |
トラブルシューティング
2021年11月時点では、IQKeyboardManager のバージョン「6.5.7」「6.5.8」だと以下のようなビルドエラーが出ていました。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ $ carthage update --platform ios --use-xcframeworks *** Cloning IQKeyboardManager *** Checking out IQKeyboardManager at "v6.5.8" *** xcodebuild output can be found in /var/folders/ps/dw2nsyk15ll6kh97pc2csxtw0000gn/T/carthage-xcodebuild.4pzw1P.log *** Building scheme "IQKeyboardManager" in IQKeyboardManager.xcodeproj *** Building scheme "IQKeyboardManagerSwift" in IQKeyboardManager.xcodeproj Build Failed Task failed with exit code 65: ...(省略)... This usually indicates that project itself failed to compile. Please check the xcodebuild log for more details: /var/folders/ps/dw2nsyk15ll6kh97pc2csxtw0000gn/T/carthage-xcodebuild.4pzw1P.log |
このエラーが出る場合、私の環境では「6.5.6」のバージョンだと安定していたため、
Cartfileのバージョンを固定してビルドしました。
1 |
github "hackiftekhar/IQKeyboardManager" == 6.5.6 |
ライブラリをプロジェクトに導入
ライブラリをビルドすると、「IQKeyboardManager.xcframework」と「IQKeyboardManagerSwift.xcframework」が生成されます。
公式手順に記載されているように、Swiftのプロジェクトでは「IQKeyboardManagerSwift.xcframework」のみをプロジェクトに追加します。
コード
アプリ全体でキーボード開閉に応じてViewの高さを自動で調整させたい場合は、AppDelegateやSceneDelegateに数行のコードを記述するだけでライブラリの恩恵を享受できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import UIKit import IQKeyboardManagerSwift @main class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. // ライブラリ有効化 IQKeyboardManager.shared.enable = true // キーボードの上のToolbar「「Done」ボタンがあるエリア」を非表示にする IQKeyboardManager.shared.enableAutoToolbar = false // 外側をタップしたときにキーボードを閉じる IQKeyboardManager.shared.shouldResignOnTouchOutside = true return true } |
たったこれだけです。
なお、「IQKeyboardManager.shared.enableAutoToolbar = false」の部分は別になくても良いお好みの設定ですが、私の環境ではこれがないと何故か以下のような実行時エラーが発生しておりました。
1 |
Thread 1: EXC_BAD_ACCESS (code=257, address=0x1012e27da) |
もし同じエラーが出ている方がいれば参考にしていただければ幸いです。