SwiftUI Menu点击绿色区域仅触发手势不弹出菜单是否符合预期?
问题解答
这是预期行为,具体原因和处理思路如下:
- SwiftUI的手势响应存在优先级,父视图(绿色HStack)的
onTapGesture会优先拦截点击事件,导致子视图Menu接收不到触发展开的交互信号,因此只会执行震动逻辑,Menu不会展开。 - Menu的展开触发需要直接点击它自身的可交互区域(红色背景部分),而非父视图的其他区域。
如果想要实现点击HStack任意区域都能展开Menu,有两种可行方案:
- 移除HStack的
onTapGesture,将震动逻辑整合到Menu的触发动作中。 - 通过状态变量手动控制Menu的展开(iOS 16及以上支持更便捷的API):
@State private var showMenu = false @Environment(\.menuPresentationMode) private var menuMode var body: some View { HStack { Menu("菜单选项") { Button("选项1") {} Button("选项2") {} } .background(Color.red) } .background(Color.green) .onTapGesture { // 触发震动 UIImpactFeedbackGenerator(style: .medium).impactOccurred() // 手动展开Menu menuMode.wrappedValue.present() } }
内容的提问来源于stack exchange,提问作者user24018863
相关产品推荐
相关产品推荐

