SwiftUI,点击空白区域和滚动视图时,输入框TextField失去焦点取消键盘

518 阅读1分钟

定义一个ViewModifier,当检测到拖动手势或者点击手势时,就会调用resignFirstResponder()方法来使TextField失去焦点。
然后,通过.dismissKeyboard()修饰符将这个功能添加到任何你想要的视图上。

struct ResignKeyboard: ViewModifier {
    //滚动时取消键盘
    var drag = DragGesture().onChanged { _ in
        UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
    }
    //点击时取消键盘
    var tap = TapGesture().onEnded {
        UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
    }

    func body(content: Content) -> some View {
        content.gesture(drag).simultaneousGesture(tap)
    }
}

extension View {
    func dismissKeyboard() -> some View {
        return modifier(ResignKeyboard())
    }
}

struct FormView: View {
    @State private var name = ""
    var body: some View {
        Form {
            TextField("姓名", text: $name)
        }
        .dismissKeyboard()
    }
}