Обнаружение и пересылка касаний в любом месте экрана в SwiftUI - PullRequest
2 голосов
/ 16 июня 2020

В приложении 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 не работает.

Есть идеи, как заставить это работать?

1 Ответ

1 голос
/ 16 июня 2020

вы пытались установить

 cancelsTouchesInView = false 

в TapGesture?

...