onTapGesture 禁用我的选取器和分段点击
Posted
技术标签:
【中文标题】onTapGesture 禁用我的选取器和分段点击【英文标题】:onTapGesture disables my Picker and Segment tap 【发布时间】:2020-04-15 20:25:31 【问题描述】:我正在使用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[$0])%")
.pickerStyle(SegmentedPickerStyle())
.onTapGesture
let keyWindow = UIApplication.shared.connectedScenes
.filter($0.activationState == .foregroundActive)
.map($0 as? UIWindowScene)
.compactMap($0)
.first?.windows
.filter($0.isKeyWindow).first
keyWindow!.endEditing(true)
【问题讨论】:
由于 ios 15 中仍然存在此错误,因此我提交了雷达:openradar.appspot.com/radar?id=5041898704076800 【参考方案1】:删除您的 .onTapGesture 并将其添加到表单中:
.gesture(DragGesture().onChanged_ in UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil))
【讨论】:
问题是当我想滚动到表单底部以填充文本字段时,这是不可能的......【参考方案2】:你会想用一些 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 禁用我的选取器和分段点击的主要内容,如果未能解决你的问题,请参考以下文章
onTapgesture 禁用 View SwiftUI 的按钮
SwiftUI:将链接与 onTapGesture 一起使用
禁用 SwiftUI SegmentedPickerStyle Picker 中的段?