选择器干扰 onTapGesture

Posted

技术标签:

【中文标题】选择器干扰 onTapGesture【英文标题】:Picker interfere with onTapGesture 【发布时间】:2020-05-25 08:56:49 【问题描述】:

我想澄清一下,我已经搜索了答案,但没有找到任何有用的东西。 我已经发布了这个问题,但我已经修改了它,因为我为代码提供了图像而不是使用文本。

我有以下代码:

struct TimeChoiceView: View 

    @State var buttonText = "None"
    @State var isPressed = false
    var text : String = "SomeView"

    var body: some View
        VStack
            HStack
                VStack(alignment: .leading, spacing: 20)
                    Text(text).padding(EdgeInsets(top: 0, leading: 15, bottom: 0, trailing: 0)).font(.system(size: 14))
                
                Spacer()
                VStack(alignment: .trailing)
                        Text(buttonText).padding(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 15)).foregroundColor(.gray).font(.system(size: 14)).onTapGesture 
                            self.isPressed = !self.isPressed
                            self.buttonText = self.buttonText == "None" ? "Undo" : "None"
                        
                
            
            HStack 
                if isPressed 
                    TimeChoice()
                
            
        
    


在此视图中,TimeChoice 是使用以下代码实现的 Picker:

struct TimeChoice: View
    @State var hours: Int = 8
    @State var minutes: Int = 30

    var body: some View 
                HStack 
                    Spacer()
                    Picker("", selection: $hours)
                        ForEach(0..<23, id: \.self)  i in
                            Text("\(i)").tag(i)
                        
                    .pickerStyle(WheelPickerStyle()).frame(width: 50, height: 70).clipped()
                    Text(":")
                    Picker("", selection: $minutes)
                        ForEach(0..<60, id: \.self)  i in
                            Text(i < 10 ? "0\(i)" : "\(i)").tag(i)
                        
                        .pickerStyle(WheelPickerStyle()).frame(width: 50, height: 70).clipped()
                    Spacer()
                
    

picker 的出现是由TimeChoiceView 中的onTapGesture 方法触发的,但是如您所见,尝试再次按下Undo 按钮不会触发相关操作。我可以设置选择器,但不能设置按钮。我有理由认为这与干扰选择器的.onTapGesture 方法有关,因为只有在我按下按钮并且选择器消失时才会发生这种情况。有没有人经历过这样的行为?

【问题讨论】:

您能否提供最小的可重现示例,因为提供的代码由于缺少依赖项而无法测试? @Asperi 抱歉,它现在应该可以工作了。我错过了一些修复。 【参考方案1】:

问题在于,在提供的代码中,Picker 在打开时会重叠按钮(甚至被视觉剪辑),因此请处理所有点击事件。

解决方案是将按钮面板放置在上方 可选地显示选择器视图。使用 Xcode 11.4 / ios 13.4 测试

var body: some View
    VStack
        HStack
            VStack(alignment: .leading, spacing: 20)
                Text(text).padding(EdgeInsets(top: 0, leading: 15, bottom: 0, trailing: 0)).font(.system(size: 14))
            
            Spacer()
            VStack(alignment: .trailing)
                    Text(buttonText).padding(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 15)).foregroundColor(.gray).font(.system(size: 14))
                    .onTapGesture 
                        self.isPressed.toggle()
                        self.buttonText = self.buttonText == "None" ? "Undo" : "None"
                    
            
        .zIndex(1)          // << here !!
        HStack 
            if isPressed 
                TimeChoice()
            
        
    

【讨论】:

以上是关于选择器干扰 onTapGesture的主要内容,如果未能解决你的问题,请参考以下文章

CSS 选择器

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

CSS3中的选择器

组件范围内的 CSS 选择器最佳实践 [关闭]

使用 ESP8266 制作 WiFi 干扰器 - 无需密码即可使用任何 WiFi

【css】通配符选择器&清除浏览器默认样式