【iOS】キーボードの開閉に応じて TextField の高さを自動で移動してくれる IQKeyboardManager ライブラリ【Swift】

2021年11月21日

IQKeyboardManager ライブラリ

iOSアプリでは TextField をタップすると、キーボードが下からニュルッと伸びてきます。


この際に、TextField の位置が画面の上側にあれば何も気にする必要はないですが、
下に配置していると入力エリアが隠れてしまいます。


このようなケースでは、本来ならプログラマがテキストフィールドの位置を自分で制御してあげる必要がありますが、この処理は意外と実装が面倒です。。

「テキストフィールドが隠れてしまう時は自動で位置を移動させたい・・・」

こんなプログラマのワガママを叶えてくれるライブラリが、「IQKeyboardManager」です。

このライブラリをプロジェクトに導入し、いくつかのプロパティを指定してあげるだけで、
テキストフィールドがちょうど見えやすい位置になるよう自動で制御されます。

本記事ではライブラリの導入手順と、
導入にあたっていくつかつまずいたポイントがあったため、その辺りを共有しております。

ライブラリ導入

ライブラリのリポジトリはこちらです。
ここではライブラリ管理ツールに Carthage を使っています。

Cartfile

github "hackiftekhar/IQKeyboardManager"

ライブラリをビルド

$ carthage update --platform ios --use-xcframeworks

トラブルシューティング

2021年11月時点では、IQKeyboardManager のバージョン「6.5.7」「6.5.8」だと以下のようなビルドエラーが出ていました。

$
$ 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のバージョンを固定してビルドしました。

github "hackiftekhar/IQKeyboardManager" == 6.5.6

ライブラリをプロジェクトに導入

ライブラリをビルドすると、「IQKeyboardManager.xcframework」と「IQKeyboardManagerSwift.xcframework」が生成されます。


公式手順に記載されているように、Swiftのプロジェクトでは「IQKeyboardManagerSwift.xcframework」のみをプロジェクトに追加します。

コード

アプリ全体でキーボード開閉に応じてViewの高さを自動で調整させたい場合は、AppDelegateやSceneDelegateに数行のコードを記述するだけでライブラリの恩恵を享受できます。

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」の部分は別になくても良いお好みの設定ですが、私の環境ではこれがないと何故か以下のような実行時エラーが発生しておりました。

Thread 1: EXC_BAD_ACCESS (code=257, address=0x1012e27da)

もし同じエラーが出ている方がいれば参考にしていただければ幸いです。