WWDC Quick Look 💓 By SwiftGGTeam
Keep up with the keyboard

Keep up with the keyboard

元の動画を見る

ハイライト

iOS 17 では、キーボードを別のプロセスに移動して、セキュリティとメモリ効率を向上させると同時に、UIKeyboardLayoutGuide、 追加followsUndockedKeyboardusesBottomSafeAreaそしてkeyboardDismissPadding属性を使用すると、開発者は自動レイアウト制約を使用して、キーボードの高さを手動で計算することなく、フローティング キーボード、分割画面シーン、およびキーボードの格納アニメーションを処理できるようになります。

主要内容

アウトプロセス キーボード

iOS 17 では、キーボード ビューとロジックはアプリのプロセスから独立しています。これにより、次の 2 つの利点がもたらされます。

  • セキュリティ: アプリはキーボード処理中にユーザー入力に直接アクセスできないため、プライバシー漏洩のリスクが軽減されます。
  • メモリ効率: アプリごとに 1 つではなく、システム全体で必要なキーボード インスタンスは 1 つだけです

この変更はほとんどのアプリに対して透過的です。ただし、コードがテキスト入力と選択の変更のタイミングに特に敏感な場合は、新しい非同期動作に注意する必要があります。

ステージマネージャーが提起するレイアウトの課題

全画面モードでは、キーボードの調整は非常に簡単です。キーボードの高さだけビューを上に移動するだけです。しかし、Stage Manager はこの想定を打ち破ります。

  • アプリが全画面表示にならず、キーボード シーンとアプリ ウィンドウの位置が合わなくなる可能性があります
  • 計算する必要があるのは、キーボード全体の高さではなく、キーボードとアプリ ウィンドウの交差する高さです。
  • 複数のウィンドウが同時に存在する可能性があり、それぞれに独立した適応計算が必要です

伝統的UIKeyboardWillShowNotificationこの方法では、Stage Manager での画面座標変換とマルチウィンドウ シーンの追加処理が必要です。

UIKeyboardLayoutGuide の機能強化

iOS 15で導入されましたUIKeyboardLayoutGuideiOS 17 では 3 つの新機能を利用できます。

  • followsUndockedKeyboard: フローティング キーボードの位置の変化を追跡するかどうかを制御します。
  • usesBottomSafeArea: キーボードが格納されたときにレイアウトを安全領域の一番下に戻すかどうかを制御します。
  • keyboardDismissPadding: キーボードが格納されているときの余分な間隔を設定します。

メッセージとスポットライトはに移行されましたUIKeyboardLayoutGuideこの解決策として、Apple は開発者がキーボードの通知を手動でリッスンするのではなく、この方法を優先的に使用することを推奨しています。

詳細

基本的な使用法: キーボード レイアウト ガイド

06:21

// 将文本视图底部与键盘顶部对齐
view.keyboardLayoutGuide.topAnchor.constraint(
    equalTo: textView.bottomAnchor
).isActive = true

キーポイント:

  • keyboardLayoutGuideはいUIViewビュー座標系でのキーボードのレイアウト領域を表す属性 -topAnchorキーボードの上端に相当します
  • キーボードがポップアップすると、topAnchor自動的に上に移動し、制約されたビューを一緒に移動させます
  • キーボードを折りたたむと、topAnchor画面の一番下に戻ると、ビューが自動的にリセットされます
  • 手動で通知を聞く必要はありません。自動レイアウトがアニメーションを自動的に処理します。

セーフ エリアの動作を制御する: usesBottomSafeArea

07:56

// 下部セーフエリアを無効化し、キーボード収納時にレイアウトをセーフエリアではなくビュー下端へ戻す
view.keyboardLayoutGuide.usesBottomSafeArea = false

// 文本框顶部与背景顶部保持系统间距
textField.topAnchor.constraint(
    equalToSystemSpacingBelow: backdrop.topAnchor, 
    multiplier: 1.0
).isActive = true

// 键盘顶部至少在文本框底部一个系统间距之下
view.keyboardLayoutGuide.topAnchor.constraint(
    greaterThanOrEqualToSystemSpacingBelow: textField.bottomAnchor, 
    multiplier: 1.0
).isActive = true

// 键盘顶部与背景底部对齐(键盘收起时)
view.keyboardLayoutGuide.topAnchor.constraint(
    equalTo: backdrop.bottomAnchor
).isActive = true

// 安全区域底部始终不低于文本框底部
view.safeAreaLayoutGuide.bottomAnchor.constraint(
    greaterThanOrEqualTo: textField.bottomAnchor
).isActive = true

キーポイント:

  • usesBottomSafeArea = falseキーボードを収納したときkeyboardLayoutGuide.topAnchor安全領域の下部ではなく、ビューの下部に戻ります
  • これは、画面全体を埋める必要があるレイアウトにとって重要です。 -greaterThanOrEqualToSystemSpacingBelowキーボードとテキストボックスの間に少なくともシステムスペースがあることを確認してください
  • 複数の制約を組み合わせて、キーボードのポップアップ状態と格納状態を処理します。

キーボード終了間隔:keyboardDismissPadding

09:40

var dismissPadding = aboveKeyboardView.bounds.size.height

// 设置键盘收起时的额外间距
view.keyboardLayoutGuide.keyboardDismissPadding = dismissPadding

キーポイント:

  • keyboardDismissPaddingキーボードが格納されているときのレイアウトと画面の下部の間の余分なスペースを制御します。
  • キーボードの上にツールバーや追加のビューがあるシナリオに適しています
  • これらの追加ビューは、キーボードが格納されているときに画面上に残る必要があります。

キーボード通知を手動で処理する (代替ソリューション)

12:11

キーボード通知を使用する必要がある場合、iOS 17 ではより正確な画面レベルの情報が提供されます。

func handleWillShowOrHideKeyboardNotification(notification: NSNotification) {
    // 通知から UIScreen オブジェクトを取得(iOS 16.1 で追加)
    guard let screen = notification.object as? UIScreen else { return }
    
    // 通知の画面が現在のビューの画面と一致することを確認する
    guard screen.isEqual(view.window?.screen) else { return }
    
    // キーボード終了位置の画面座標を取得する
    let endFrameKey = UIResponder.keyboardFrameEndUserInfoKey
    guard let keyboardFrameEnd = notification.userInfo?[endFrameKey] as? CGRect else { return }
    
    // 画面座標系からビューのローカル座標系へ変換する
    let fromCoordinateSpace: UICoordinateSpace = screen.coordinateSpace
    let toCoordinateSpace: UICoordinateSpace = view
    let convertedKeyboardFrameEnd = fromCoordinateSpace.convert(keyboardFrameEnd, to: toCoordinateSpace)
    
    // キーボードとビューの交差領域を計算する
    let viewIntersection = view.bounds.intersection(convertedKeyboardFrameEnd)
    
    var bottomOffset = view.safeAreaInsets.bottom
    
    // キーボードがビューと交差している場合は、交差領域の高さをオフセットとして使う
    if !viewIntersection.isEmpty {
        bottomOffset = viewIntersection.size.height
    }
    
    // 制約を更新してアニメーションを実行する
    movingBottomConstraint.constant = bottomOffset
    
    // 通知内のアニメーションパラメータでレイアウト更新を実行する
    // ...
}

キーポイント:

  • iOS 16.1以降、UIKeyboardWillShowNotificationobjectはいUIScreen、どの画面のキーボードが変更されるかを正確に知ることができます
  • 必ず使用してくださいscreen.isEqual(view.window?.screen)マルチウィンドウシナリオでのエラー処理を回避するためのフィルター
  • 座標変換を使用する必要がありますUICoordinateSpace.convert(_:to:)、直接使用することはできませんCGRect操作
  • キーボードの全高ではなく、キーボードとビューの交差する高さが計算されます。これは、Stage Manager の分割画面シナリオでは重要です。

インライン予測: インライン予測

14:38

// インラインテキスト予測を有効化
textView.inlinePredictionType = .yes

// インラインテキスト予測を無効化
textField.inlinePredictionType = .no

キーポイント:

  • inlinePredictionTypeインラインテキスト予測(灰色の推奨テキスト)を表示するかどうかを制御します
  • 3 つのオプション:.default(システムにより決定されます)、.no(無効)、.yes(有効にする)
  • パスワード入力ボックス、確認コード入力、および予測を表示したくないその他のシナリオに適しています
  • フォローするUITextInputTraitsプロトコルのすべてのテキスト入力コントロールがサポートされています

重要ポイント

1. キーボード レイアウト ガイドを使用して、すべてのキーボード適応コードをリファクタリングします。

やるべきこと: すべての手動モニターをプロジェクトに配置します。UIKeyboardWillShowNotificationコードを次のように置き換えますUIKeyboardLayoutGuide制約。

実行する価値がある理由:UIKeyboardLayoutGuideフローティング キーボード、分割画面、複数のウィンドウなどの複雑なシナリオを自動的に処理し、コードの量を 80% 以上削減し、動作の信頼性を高めます。

開始方法: すべてのキーボード通知のリスニング コードを見つけ、通知の登録とコールバックを削除し、viewDidLoad追加するkeyboardLayoutGuide.topAnchor制約。フローティング キーボード、分割画面、回転、その他のシナリオをテストします。

2. Stage Manager 用にマルチウィンドウ アプリケーションを最適化する

対処方法: iPad のマルチウィンドウ シナリオで、各ウィンドウがキーボード ポップアップを個別に正しく処理することを確認します。

実行する価値がある理由: Stage Manager では複数のアプリ ウィンドウを同時に表示でき、各ウィンドウにキーボードの調整が必要な場合があります。実装が正しくないと、あるウィンドウのキーボードが別のウィンドウのレイアウトに影響を与える可能性があります。

開始方法: iPad で Stage Manager を開き、アプリの複数のウィンドウを開き、各ウィンドウでキーボードをトリガーし、レイアウトが現在のウィンドウにのみ影響することを確認します。使用notification.object as? UIScreen通知をフィルターします。

3. 機密入力のインライン予測を無効にする

対処方法: パスワードボックス、認証コードボックス、クレジットカード番号入力ボックスに明示的に設定します。inlinePredictionType = .no

実行する価値がある理由: インライン予測では、入力ボックスに灰色の提案テキストが表示されます。これはプライバシーの問題であると同時に、機密情報のユーザー エクスペリエンスの問題でもあります。

開始方法: すべてのテキスト入力コントロールを調べ、機密情報を含むフィールドを設定します。inlinePredictionType = .no。同時にチェックしてくださいautocorrectionTypeそしてautocapitalizationTypeそれも正しく設定されていますか?

4. キーボード上のツールバーのスムーズな格納を実装します。

手順: キーボードの上にカスタム ツールバーを配置し、キーボードが格納されたときに画面の下部にスムーズに遷移します。

価値がある理由: 多くのアプリケーション (メモ取り、文書編集など) には、キーボードの上に書式設定ツールバーがあります。keyboardDismissPaddingこのレイアウトを手動で計算せずに正しく機能させるようにしてください。

開始方法: セットアップview.keyboardLayoutGuide.keyboardDismissPadding = toolbarHeight、次にツールバーの下部を次のように拘束します。keyboardLayoutGuide.topAnchor

関連セッション

コメント

GitHub Issues · utterances