Keyboard Avoidance は、システムキーボードが表示されたときにiOSアプリのインターフェースを適応させるテクニックです。キーボードがテキストフィールドや他のインタラクティブ要素を覆い隠す可能性があります。このメカニズムを実装しないと、ユーザーは自分が何を入力しているかを物理的に見ることができず、エラーが発生し、ユーザーエクスペリエンスが低下します。Apple Developer Documentation(2026)によると、iOS 15以降はUIScrollViewをUIScrollView.keyboardLayoutGuideと組み合わせて使用し、コンテンツのオフセットを自動管理することが推奨されています。
重要なポイント
Keyboard Avoidance は、iOSでシステムキーボードが表示されたときにアクティブな入力フィールドの可視性を確保する一連のテクニックです。基本的な問題:キーボードは画面の最大50%を占め、テキストフィールド、送信ボタン、その他の要素を含むインターフェースの下半分を覆い隠します。
実装には3つの主要なアプローチがあります:Keyboard Notificationsによる手動管理(従来の方法、iOS 3.0以降で動作)、自動スクロール付きUIScrollViewの使用(Apple推奨)、およびKeyboard Layout Guide(iOS 15+の最新方法)。選択は、サポートする最小iOSバージョンとインターフェースの複雑さに依存します。
Appleによると、Keyboard Avoidanceの欠如は、テキストフィールドがキーボードで完全に覆われている場合、レビュー中のアプリ拒否の最も一般的な原因の1つです。App Store Guidelinesは、アクティブな入力中にすべてのインタラクティブ要素がアクセス可能であることを明示的に要求しています。
iOSはインターフェースのセマンティクスを認識しないため、どの要素を表示したままにするべきかを自動的に判断できません。1つのテキストフィールドがあるシンプルなフォームでは、画面全体を上に移動するだけで十分です。カスタムパネル、フローティングボタン、複数のセクションがある複雑なインターフェースでは、異なる動作ロジックが必要です。
さらに、一部のアプリは意図的にコンテンツを移動しません。例えば、キーボードがワークスペースの一部であるキーボード電卓やエディターなどです。iOSは開発者に決定を委ね、あらゆるシナリオに対応する柔軟なAPIを提供しています。
UIKeyboardWillShowNotification は、キーボードが表示される前にiOSが送信する主要な通知です。これには、UIResponder.keyboardFrameEndUserInfoKeyディクショナリ内のキーボードの最終位置を示すCGRectと、UIResponder.keyboardAnimationDurationUserInfoKey内のアニメーション期間が含まれています。
通知ハンドラーは、アクティブなテキストフィールドとキーボードの間のオーバーラップを計算し、コンテナの下部マージン(contentInsetまたはframe)を変更する必要があります。フィールドがキーボードの上端より下にある場合、コンテンツはオーバーラップの量だけ上に移動します。キーボードが非表示になると、マージンは元の値に戻ります。
@objc func keyboardWillShow(_ notification: Notification) {
guard let keyboardFrame = notification
.userInfo?[UIResponder.keyboardFrameEndUserInfoKey]
as? CGRect else { return }
let keyboardHeight = keyboardFrame.height
scrollView.contentInset.bottom = keyboardHeight
scrollView.verticalScrollIndicatorInsets.bottom = keyboardHeight
}
通知を使用する場合、システムキーボードと同期してアニメーションを処理することが重要です。iOSはアニメーションカーブ(UIResponder.keyboardAnimationCurveUserInfoKey)と期間を提供します。これらのパラメータでUIView.animateを使用して、キーボードの表示と同時にコンテンツがスムーズに移動するようにします。
UIScrollView.keyboardLayoutGuide は、iOS 15で導入されたKeyboard Avoidanceのための最新APIです。キーボードの位置を自動的に追跡し、インターフェースの下部をキーボードの上端に接続するAuto Layout制約を更新します。
使用するには、UIScrollViewまたはUIStackViewでlayout guideをアクティブにし、下部のコンテンツ制約をそれにアタッチするだけです。通知、高さの計算、アニメーションに関する手作業は一切不要で、システムが自動的にすべてを行い、キーボードの表示と非表示に合わせてアニメーションを同期します。
// Keyboard Layout Guideを有効にする (iOS 15+)
scrollView.keyboardLayoutGuide.followsUndockedKeyboard = true
// 下部制約をキーボードの上部に固定する
contentView.bottomAnchor.constraint(
equalTo: scrollView.keyboardLayoutGuide.topAnchor
).isActive = true
followsUndockedKeyboard は、下部エッジから切り離せるキーボード(iPad上)にガイドが応答するかどうかを決定するプロパティです。インターフェースがフローティングキーボードで正しく動作する場合にのみtrueに設定します。iPhoneでは、このプロパティは無視されます。キーボードは常に下部エッジに固定されています。
UIScrollView は、AppleがKeyboard Avoidanceの基盤として使用することを推奨するコンテナです。キーボードが表示されると、scroll viewはcontentInset.bottomを増やし、コンテンツを上にスクロールしてアクティブなフィールドを表示できるようにします。
主要なメソッドはscrollRectToVisibleで、指定された矩形(アクティブなテキストフィールド)が表示領域に入るようにプログラムでscroll viewをスクロールします。contentInsetの変更とscrollRectToVisibleの呼び出しを組み合わせることで、フィールドが覆われていないだけでなく、表示領域の上部に配置されることが保証されます。
func adjustScrollForKeyboard(
keyboardHeight: CGFloat,
activeField: UIView
) {
scrollView.contentInset.bottom = keyboardHeight
scrollView.verticalScrollIndicatorInsets.bottom = keyboardHeight
var visibleRect = view.frame
visibleRect.size.height -= keyboardHeight
if activeField.frame.origin.y > visibleRect.maxY {
scrollView.scrollRectToVisible(
activeField.frame, animated: true
)
}
}
UITableViewを伴うUIViewControllerの場合、AppleはUITableViewControllerの使用を推奨しています。これはキーボード表示時に自動的にcontentInsetを調整します。追加されたテーブルを持つUIViewControllerを使用する場合は、手動でKeyboard Avoidanceを実装する必要があります。UITableViewControllerはカスタムコントローラーにこの動作を提供しません。
Auto Layout を使用すると、アニメーションをプログラムせずにKeyboard Avoidanceを実装できます。特定の制約のアクティビティ(isActive)を変更するか、キーボード通知に応じてその定数を更新するだけです。
典型的なスキーム:scroll viewまたはコンテンツの下部マージン用にIBOutlet NSLayoutConstraintを作成し、keyboardWillShowハンドラーでconstraint.constant = keyboardHeightを設定し、keyboardWillHideで0にリセットします。スムーズな遷移のために、animateブロック内でlayoutIfNeededを介してレイアウトを更新します。
| アプローチ | iOSバージョン | 複雑さ | 推奨 |
|---|---|---|---|
| Keyboard Notifications | iOS 3.0+ | 中 | 古いバージョンのサポート用 |
| UIScrollView + contentInset | iOS 2.0+ | 低 | 汎用的なアプローチ、Apple推奨 |
| Keyboard Layout Guide | iOS 15+ | 最小 | 最新のアプローチ(iOS 15+) |
| IQKeyboardManager | iOS 8.0+ | ゼロ | 迅速な解決策、人気のライブラリ |
UIStackViewを使用する場合、下部マージン制約の変更も機能します。スタックビューは子要素を自動的に再配分します。ただし、スタックビューがUIScrollView内にある場合は、内部の制約ではなく、scroll view自体のcontentInsetを管理することが推奨されます。
IQKeyboardManager は、コントローラーにコードを1行も書かずに自動Keyboard Avoidanceを実装する最も人気のあるライブラリです(GitHubで16,000以上のスター)。メソッドスウィズリングを使用してテキストフィールドを追跡し、キーボードが表示されると自動的にコンテンツを上げます。
このライブラリは柔軟な設定を提供します:フィールドとキーボードの間の距離を指定したり、特定のコントローラーで有効/無効にしたり、UITextViewやカスタム入力ビューの動作を設定したりできます。ただし、メソッドスウィズリングは他のライブラリと競合する可能性があり、Appleは予測不可能な副作用のため、プロダクションコードでのこのアプローチを推奨していません。
代替案としては、TPKeyboardAvoiding(軽量ライブラリ、~2,000スター)やコミュニティのKeyboardManagerがあります。最新のプロジェクトでは、AppleはiOS 15+の組み込みツールを使用することを推奨し、より低い最小バージョンのプロジェクトでは、contentInset付きのUIScrollView(最も信頼性の高い組み込みソリューション)を推奨しています。
よくある質問
Keyboard Avoidance は、キーボード表示時にインターフェースを移動し、アクティブなテキストフィールドを表示したままにするテクニックです。自動レイアウト適応のために、UIScrollView、Keyboard Notifications、またはiOS 15+のKeyboard Layout Guideを介して実装されます。
キーボード表示時にメインビューのframeを変更し、キーボードの高さだけ高さを減らすことができます。通知のuserInfoからのパラメータを使用して、アニメーションブロック内でframeを更新するには、UIKeyboardWillShowNotificationとUIKeyboardWillHideNotificationを使用します。
keyboardLayoutGuide は、UIScrollView(iOS 15+)に追加されるUILayoutGuideです。キーボードの上端を自動的に追跡し、キーボードの表示と非表示時にそのNSLayoutConstraintを更新し、システムキーボードとアニメーションを同期します。
IQKeyboardManager が最も人気で、コードは不要です。TPKeyboardAvoidingは軽量な代替手段です。新しいプロジェクトでは、サードパーティライブラリがApple推奨しないメソッドスウィズリングを使用するため、iOS 15+の組み込みツールを使用することが推奨されます。
IQKeyboardManager を使用している場合は、特定のUIViewControllerに対してenabled = falseを呼び出します。手動実装の場合は、その画面でキーボード通知を購読しないか、キーボード表示時にcontentInsetをゼロにリセットします。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。