我的应用程序中有一个菜单,当菜单打开时(来自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()
}
所以这很简单——点击Open menu
触发器,点击注册,播放触觉,然后打开菜单。
但如前所述,无论出于何种原因,有时我按下Open menu
元素,触觉播放,但实际菜单不会打开。
无论原因是什么,我想知道一旦菜单实际打开(或者更好的是,实际打开) ,是否有任何方法可以执行操作(例如前面提到的触觉反馈)?我想尽一切办法搜索,但一无所获。
这也很重要,因为菜单也会在长按时打开,这是 iOS 打开菜单的标准操作。即使我可以为长敲击添加另一个单独的处理程序(为两种情况提供触觉),但这似乎根本不是一个合适的方法。
结合有时菜单无法打开的事实,我似乎肯定需要其他解决方案。任何人都可以分享任何想法?我是否缺少某种 onXXXXX 处理程序,当菜单打开时会触发?
谢谢!
PS:为了提供更多细节,我正在尝试对 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.