web-dev-qa-db-fra.com

Comment détectez-vous un événement SwiftUI touchDown sans mouvement ni durée?

J'essaie de détecter le premier contact d'un doigt avec une vue dans SwiftUI. Je pourrais le faire très facilement avec UIKit Events mais je ne peux pas comprendre cela dans SwiftUI.

J'ai essayé un DragGesture avec un mouvement minimum de 0 mais il ne changera toujours pas jusqu'à ce que votre doigt bouge.

TapGesture ne fonctionnera que lorsque vous soulevez votre doigt et LongPressGesture ne se déclenchera pas assez rapidement, quels que soient les paramètres définis.

DragGesture(minimumDistance: 0, coordinateSpace: .local).onChanged({ _ in print("down")})

LongPressGesture(minimumDuration: 0.01, maximumDistance: 100).onEnded({_ in print("down")})

Je souhaite détecter un événement touchDown dès qu'un doigt entre en contact avec une vue. Les gestes par défaut d'Apple ont des restrictions de distance ou de temps.

4
eli_slade

Vous pouvez créer un modificateur de vue de cette façon:

extension View {
    func onTouchDownGesture(callback: @escaping () -> Void) -> some View {
        modifier(OnTouchDownGestureModifier(callback: callback))
    }
}

private struct OnTouchDownGestureModifier: ViewModifier {
    @State private var tapped = false
    let callback: () -> Void

    func body(content: Content) -> some View {
        content
            .simultaneousGesture(DragGesture(minimumDistance: 0)
                .onChanged { _ in
                    if !self.tapped {
                        self.tapped = true
                        self.callback()
                    }
                }
                .onEnded { _ in
                    self.tapped = false
                })
    }
}

Vous pouvez maintenant l'utiliser comme:

struct MyView: View {
    var body: some View {
        Text("Hello World")
            .onTouchDownGesture {
                print("View did tap!")
            }
    }
}
0
superpuccio