В приложении 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
как , предлагаю здесь :
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 не работает.
Есть идеи, как заставить это работать?