选择器干扰 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的主要内容,如果未能解决你的问题,请参考以下文章