【发布时间】:2021-02-01 13:33:38
【问题描述】:
我目前正在努力解决 SwiftUI 问题:
以非常抽象的方式,这就是我的应用程序代码的样子(不是实际代码,只是为了讨论这里的事情):
struct SwiftUIView: View {
@State private var toggle: Bool = true
var body: some View {
VStack {
Spacer()
if toggle {
Text("on")
} else {
Text("off")
}
Spacer()
Rectangle()
.frame(height: 200)
.onTapGesture { toggle.toggle() }
Spacer()
Menu("Actions") {
Button("Duplicate", action: { toggle.toggle() })
Button("Rename", action: { toggle.toggle() })
Button("Delete", action: { toggle.toggle() })
}
Spacer()
}
}
}
那么这里的本质是什么?
- 背景中有一个元素(矩形)会对用户的点击输入做出反应
- 有一个菜单,其中包含在点击时也会执行某些操作的项目
现在,我面临以下问题:
点击“操作”打开菜单时,菜单会打开 - 到目前为止一切顺利。但是,当我现在决定不想触发菜单中包含的任何操作并点击背景上的某处以将其关闭时,我可能会点击背景中的矩形。如果我这样做,矩形上的点击会直接触发 onTapGesture 中定义的动作。
但是,理想的行为是,当菜单打开时,我可以点击菜单外的任意位置将其关闭而不触发任何其他元素。
知道如何实现这一目标吗?谢谢!
(如果需要进一步说明,请在 cmets 中告诉我。)
【问题讨论】:
-
在重新测试我给你的代码后你是对的,它不起作用。我看起来到处都是,似乎没有办法做到这一点,因为当菜单出现时我找不到执行代码的方法。我假设苹果希望菜单用户意识到菜单不像警报那样起作用,并且在显示它时,它后面的元素没有被禁用。从用户的角度来看,我不认为你的问题真的会是一个问题,因为他们已经习惯了。
-
感谢您重新测试。可能,你是对的。但是,我不完全同意您的假设(或者 Apple 可能在这里选择的方法。因为他们自己实现的方式不同。例如,当您打开文件应用程序并导航到“浏览”选项卡时,您可以打开一个菜单通过点击右上角的三个点。然后,当点击屏幕上的任何其他位置时,它不会触发背景中的任何按钮/菜单项,而只会在用户执行任何其他操作之前关闭菜单。这就是我作为用户所期望的行为。
-
确实如此。老实说,我不知道他们是怎么做到的!我知道无法以编程方式显示菜单,因此在显示菜单时不能更改任何变量。菜单的元素在背景中呈现,因此出现事件时没有正确的。我还查看了实际上对您有用的上下文菜单。缺点是它们需要长按并模糊背后的背景。所以他们不是这样做的,因为它显示在一个简单的点击上,并且在文件应用程序中没有模糊。并且无法在单击时显示上下文菜单...
-
我只是想补充一点,我在
ToolBarItem的.navigationBarTrailling位置有一个菜单,在.principal位置还有一个选择器。在选择器上点击菜单外部不会触发选择器。但是导航栏外的任何点击都会触发。似乎是对屏幕的疏忽,因为苹果确实认为阻止点击导航栏是合适的。