【发布时间】:2020-10-05 14:35:18
【问题描述】:
在 SwiftUI 应用程序中,我需要检测屏幕上的任何点击。仅检测,然后将其转发到底层视图。作为一个用例,考虑向服务器发送“在线”用户状态更新以响应任何用户活动。
我当然不想为此目的在每个视图中添加手势识别器。我尝试在 SceneDelegate 中添加一个全局的。就检测到任何水龙头而言,这都是有效的:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// ... snip other code
initGlobalTapRecognizer()
}
// MARK: UIGestureRecognizerDelegate
extension SceneDelegate: UIGestureRecognizerDelegate {
func initGlobalTapRecognizer() {
let tapGesture = UITapGestureRecognizer(target: self, action: nil)
tapGesture.delegate = self
window?.addGestureRecognizer(tapGesture)
}
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
print("tapped")
return true
}
}
但这会破坏一些 SwiftUI 控件。例如,按钮可以工作,但 TabView 不再响应点击。
我尝试了另一种方式,将simultaneousGesture 用作suggest here:
struct ContentView: View {
@State var selectedTab: Int = 1
var body: some View {
TabView(selection: $selectedTab) {
VStack {
Text("tab 1")
Button(action: { print("button 1 click") }, label: { Text("button 1") })
}
.tabItem( { Text("tab 1") } )
.tag(1)
VStack {
Text("tab 2")
}
.tabItem( { Text("tab 2") } )
.tag(2)
}
.contentShape(Rectangle())
.simultaneousGesture(TapGesture().onEnded({ print("simultaneous gesture tap") }))
}
}
同样的结果,按钮工作,但 TabView 坏了。
任何想法如何让它工作?
【问题讨论】: