SwiftUIを使ってソフトウェアキーボードを閉じる方法です。
概要
@FocusStateを使用し入力フォームのフォーカスを外す事でソフトウェアキーボードを閉じます。
コード
import SwiftUI
struct FocusStateBoolView: View {
@State var text = ""
@FocusState var focus:Bool
var body: some View {
Form {
TextField("TextField", text: self.$text)
.focused(self.$focus)
Button("Focus ON"){
self.focus = true
}
Button("Focus OFF"){
self.focus = false
}
}
}
}
解説
ソフトウェアキーボードを閉じるにはフォーカス(選択状態)を解除するする必要があります。
iOS15からは変数でフォーカスの状態を保持できる様になった為、
これを用いてフォーカスを外してキーボードを閉じます。
なお、標準ではreturnキーを押すか、Viewを非表示にする事でフォーカスが外れます。
思うように外す事が出来ない場合があるため、閉じる機能を提供する必要がある場合もあります。
@FocusState
フォーカスの状態を変数で保持するために、
iOS15から追加された@FocusStateを使用します。
@Stateの様にメンバ変数の前につけます。
@FocusState var focus:Bool
この時使える変数はBool又はHashableを実装したものです。
AppleのドキュメントではenumにHashableを実装して使用しています。
.focused
次にModifierの.focusedを使います。
TextField("TextField", text: self.$text)
.focused(self.$focus)
これで変数とフォーカスの状態が紐付けられました。
この変数のtrue/falseを切り替える事でフォーカスが切り替わり、
ソフトウェアキーボードの開閉が行われます。
余談
シミュレータについて
シミュレータでソフトウェアキーボードを使う際は「shift+cmd+K」で切り替えられます。
I/Oの項目からの切り替えも出来ます。
ブログ記事の紹介
本記事は試験的にQiita用に要点を絞って簡潔にまとめて書いてみました。
ブログには細かな検証や複数の例を載せていますが、Qiita簡潔に最低限にする予定です。
好みがあると思うので使い分けて下さい。
以下のブログには詳細な説明や他のコード例があります。
ソフトウェアキーボードを閉じる方法(iOS14以前やUIの実装も含む)
@FocusStateの解説