[Swift] 67 メモアプリ製作 その19 キーボード表示時のウィジェット移動対策

[Mac M2 Pro 12CPU, Ventura 13.6.1, iOS 17.1.2, Xcode 15.0]

アプリへの入力時に画面底部にあるボタンがキーボードによって上に押し上げられてしまう現象への対策です。

キーボード表示時にNotificationCenterから通知を受け取り、Bool値が変わると以下のモディファイアが動作するようにしました。

ボタン使用不可
.disabled(showingKeyboard)
ボタン非表示
.opacity(showingKeyboard ? 0.0 : 1.0)

キーボードの高さを取得してpaddingモディファイアでbottomからオフセットする方法も試しましたが、上手く出来ませんでした。

キーボードがない状態
キーボードが出現すると”バックアップ確認”などが上に押し上げられる
キーボード表示時にボタンを非表示および使用不可にした
@State private var showingKeyboard = false

Button("backupCheck".localized) { // バックアップ確認
    showingBackupView = true
}
.sheet(isPresented: $showingBackupView) {
    BackupView().environment(\.managedObjectContext, self.viewContext)
}
.position(x: geometry.size.width * 0.48, y: geometry.size.height * 0.98)
.frame(width: 128, height: 36)
.disabled(showingKeyboard)
.opacity(showingKeyboard ? 0.0 : 1.0)
.onAppear {
    // キーボードの表示・非表示の通知を購読
    NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillShowNotification, object: nil, queue: .main) { _ in
        showingKeyboard = true
    }
    NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillHideNotification, object: nil, queue: .main) { _ in
        showingKeyboard = false
    }
}
.onDisappear {
    // 通知の購読を解除
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}