onTapGesture 禁用我的选取器和分段点击

Posted

技术标签:

【中文标题】onTapGesture 禁用我的选取器和分段点击【英文标题】:onTapGesture disables my Picker and Segment tap 【发布时间】:2020-04-15 20:25:31 【问题描述】:

我正在使用SwiftUI 创建一个Form。在我的Form 中,我有一个DatePickerTextField 和一个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 中的段?

swiftui 2.0 图片库 onTapgesture 只显示数组中的第一张图片

如何在 SwiftUI 中更改分段选取器的颜色外观?