我有一个菜单在我的应用程序中,并且当菜单打开时(从onTagGesture
操作中),我会触发触觉反馈。
然而,有时候,当我点击菜单打开触发器时,菜单实际上不会打开,但我仍然能够获得触觉反馈。我只希望在菜单确实打开时才获得触觉反馈。
以下是简化后的代码块:
Menu {
Button("Menu button", action: someAction}}
} label: {
Text("Open menu") //in reality, this a more complicated view tapping on which should open the (context) menu
}
.onTagGesture {
let generator = UIImpactFeedbackGenerator(style: .rigid)
generator.impactOccurred()
}
因此很简单-点击“打开菜单”触发器,点击被注册,触觉反馈播放,然后菜单就会打开。
但是正如所提到的,由于某些原因,有时我按下“打开菜单”元素,触觉反馈会播放,但实际菜单不会打开。
无论什么原因,我想知道是否有任何方法可以执行操作(例如上述的触觉反馈),一旦菜单实际上已经打开(或者更好的是,将要打开)?我尝试在所有可能的地方进行搜索,但毫无收获。
这也很重要,因为菜单还可以通过长按打开,这是iOS打开菜单的标准操作。尽管我可以添加另一个独立处理程序来提供两种情况的触觉反馈,但这似乎并不是正确的方法。
加上有时菜单不会打开的事实,我肯定需要其他解决方案。有人可以分享任何想法吗?我是否错过了某个当菜单即将打开时触发的onXXXXX处理程序?
谢谢!
附:为了提供更多细节,我正在尝试实现Apple开发文档中描述的菜单方法: https://developer.apple.com/documentation/swiftui/menu 作为过程的一部分,我尝试将onAppear处理程序附加到整个菜单,以及菜单中的单个元素。但是似乎都不起作用。
Menu {
Button("Open in Preview", action: openInPreview)
Button("Save as PDF", action: saveAsPDF)
.onAppear { doHaptic() } //only fires once, when menu opens, but not for subsequent appearances
} label: {
Label("PDF", systemImage: "doc.fill")
}
.onAppear { doHaptic() } //doesn't really as it fires when the menu itself appears on the screen as a child of a parent view.