onTapGesture 禁用我的选择器和分段点击
onTapGesture disables my Picker and Segment tap
我正在使用 SwiftUI
创建一个 Form
。在我的 Form
中,我有一个 DatePicker
、TextField
和一个 SegmentedPickerStyle
。
我的 TextField
使用的是 .decimalPad
,我正在尝试找到在完成键入后关闭键盘的最佳方法。
我尝试添加 .onTapGesture
,但它阻止我使用我的任何选择器。当我点击它们时没有任何反应。
这是我正在尝试做的事情:
struct ContentView: View {
@State var date = Date()
@State var price = ""
@State private var tipPercentage = 2
let tipPercentages = [10, 15, 20, 25, 0]
var body: some View {
NavigationView {
Form {
Section {
DatePicker(selection: $date, displayedComponents: .date) {
Text("Date").bold().foregroundColor(Color.init(red: 100.0/255.0, green: 208.0/255.0, blue: 100.0/255.0))
}
HStack {
Text("Price"))
Spacer()
TextField("required", text: $price).multilineTextAlignment(.trailing).keyboardType(.decimalPad)
}
}
Section(header: Text("How much tip do you want to leave?")) {
Picker("Tip percentage", selection: $tipPercentage) {
ForEach(0 ..< tipPercentages.count) {
Text("\(self.tipPercentages[[=10=]])%")
}
}
.pickerStyle(SegmentedPickerStyle())
}
}
.onTapGesture {
let keyWindow = UIApplication.shared.connectedScenes
.filter({[=10=].activationState == .foregroundActive})
.map({[=10=] as? UIWindowScene})
.compactMap({[=10=]})
.first?.windows
.filter({[=10=].isKeyWindow}).first
keyWindow!.endEditing(true)
}
}
}
}
你会想用一些 UIKit 的东西来做到这一点。
首先,制作一个自定义手势识别器:
class CloseKeyboardGestureRecognizer: UIGestureRecognizer {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
// Don't run if the tap is in a TextField, since the keyboard shouldnt hide when tapping a textfield.
guard let touch = touches.first?.view, touch is UITextField else {
state = .began
return
}
state = .failed
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
state = .ended
}
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent) {
state = .cancelled
}
}
extension CloseKeyboardGestureRecognizer: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
}
然后在SceneDelegate中,在scene(_:willConnectTo:options:)中,添加:
let gesture = CloseKeyboardGestureRecognizer(target: window, action:#selector(UIView.endEditing))
gesture.delegate = gesture
gesture.cancelsTouchesInView = false
gesture.requiresExclusiveTouchType = false
window.addGestureRecognizer(gesture)
}
这会导致在文本字段外部点击会关闭键盘,而不会影响对其他元素的点击。
删除您的 .onTapGesture 并将其添加到表单中:
.gesture(DragGesture().onChanged{_ in UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)})
我正在使用 SwiftUI
创建一个 Form
。在我的 Form
中,我有一个 DatePicker
、TextField
和一个 SegmentedPickerStyle
。
我的 TextField
使用的是 .decimalPad
,我正在尝试找到在完成键入后关闭键盘的最佳方法。
我尝试添加 .onTapGesture
,但它阻止我使用我的任何选择器。当我点击它们时没有任何反应。
这是我正在尝试做的事情:
struct ContentView: View {
@State var date = Date()
@State var price = ""
@State private var tipPercentage = 2
let tipPercentages = [10, 15, 20, 25, 0]
var body: some View {
NavigationView {
Form {
Section {
DatePicker(selection: $date, displayedComponents: .date) {
Text("Date").bold().foregroundColor(Color.init(red: 100.0/255.0, green: 208.0/255.0, blue: 100.0/255.0))
}
HStack {
Text("Price"))
Spacer()
TextField("required", text: $price).multilineTextAlignment(.trailing).keyboardType(.decimalPad)
}
}
Section(header: Text("How much tip do you want to leave?")) {
Picker("Tip percentage", selection: $tipPercentage) {
ForEach(0 ..< tipPercentages.count) {
Text("\(self.tipPercentages[[=10=]])%")
}
}
.pickerStyle(SegmentedPickerStyle())
}
}
.onTapGesture {
let keyWindow = UIApplication.shared.connectedScenes
.filter({[=10=].activationState == .foregroundActive})
.map({[=10=] as? UIWindowScene})
.compactMap({[=10=]})
.first?.windows
.filter({[=10=].isKeyWindow}).first
keyWindow!.endEditing(true)
}
}
}
}
你会想用一些 UIKit 的东西来做到这一点。
首先,制作一个自定义手势识别器:
class CloseKeyboardGestureRecognizer: UIGestureRecognizer {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
// Don't run if the tap is in a TextField, since the keyboard shouldnt hide when tapping a textfield.
guard let touch = touches.first?.view, touch is UITextField else {
state = .began
return
}
state = .failed
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
state = .ended
}
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent) {
state = .cancelled
}
}
extension CloseKeyboardGestureRecognizer: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
}
然后在SceneDelegate中,在scene(_:willConnectTo:options:)中,添加:
let gesture = CloseKeyboardGestureRecognizer(target: window, action:#selector(UIView.endEditing))
gesture.delegate = gesture
gesture.cancelsTouchesInView = false
gesture.requiresExclusiveTouchType = false
window.addGestureRecognizer(gesture)
}
这会导致在文本字段外部点击会关闭键盘,而不会影响对其他元素的点击。
删除您的 .onTapGesture 并将其添加到表单中:
.gesture(DragGesture().onChanged{_ in UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)})