首先需求引入一个办法调用体系接口躲藏键盘:
extension UIApplication {
func endEditing() {
sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}
}
// 也能够把辅佐办法增加到 View 上
extension View {
func endEditing() {
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}
// 还有一种完结是经过获取 keyWindow 调用到 UIView 的 endEditing
func endEditing() {
UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.endEditing(true)
}
}
躲藏最简略的处理方式就是在键盘按 return 的时分躲藏键盘:
struct ContentView: View {
@State private var name: String = ""
var body: some View {
TextField("姓名:", text: $name)
.onSubmit {
UIApplication.shared.endEditing()
}
}
}
对键盘的常见处理方式还有点击空白处躲藏键盘。能够经过增加 Tap 手势来到达目的。
var body: some View {
ZStack {
Color.white
.onTapGesture {
UIApplication.shared.endEditing()
}
TextField("姓名:", text: $name)
.onSubmit {
UIApplication.shared.endEditing()
}
}
}
假如点击躲藏键盘要大局处理,也能够把 TapGesture 直接加在 window 上:
@main
struct TestApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.onAppear(perform: UIApplication.shared.addTapGestureRecognizer)
}
}
}
extension UIApplication {
func addTapGestureRecognizer() {
guard let window = windows.first else { return }
let tapGesture = UITapGestureRecognizer(target: window, action: #selector(UIView.endEditing))
tapGesture.requiresExclusiveTouchType = false
tapGesture.cancelsTouchesInView = false
tapGesture.delegate = self
window.addGestureRecognizer(tapGesture)
}
}
extension UIApplication: UIGestureRecognizerDelegate {
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true // set to `false` if you don't want to detect tap during other gestures
}
}
在 iOS 15 中 SwiftUI 引入了@FocusState
来操控焦点,所以官方推荐的一个计划是经过设置焦点的值来操控键盘的弹出与躲藏。

老实说体系推荐的焦点操控有一种清澈的愚笨。
struct FocusStateView: View {
@State private var name: String = ""
@FocusState private var focusedField: Bool
var body: some View {
VStack {
TextField("姓名", text: $name)
.focused($focusedField)
HStack {
Button("focus") {
focusedField = true
}
Button("dismiss") {
focusedField = false
}
}
}
.padding()
}
}
还有一种常见的键盘处理计划是在键盘上面增加一个工具栏,增加一个完结按钮。在 SwiftUI 中也能够很简单的完结这个功能。

struct ContentView: View {
@State private var name: String = ""
var body: some View {
VStack {
TextField("姓名:", text: $name)
.padding()
}
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
Spacer()
Button("完结") {
UIApplication.shared.endEditing()
}
}
}
}
}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。