web-dev-qa-db-ja.com

動きや継続時間のないSwiftUI touchDownイベントをどのように検出しますか?

指がSwiftUIのビューと最初に接触したときを検出しようとしています。 UIKitイベントでこれを非常に簡単に行うことができましたが、SwiftUIではこれを理解できません。

最小の動き0でDragGestureを試しましたが、指が動くまで変化しません。

TapGestureは、指を離したときにのみ機能します。LongPressGestureは、パラメータの設定に関係なく、十分に速くトリガーされません。

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

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

指がビューに触れるとすぐにtouchDownイベントを検出したいと思います。 Appleのデフォルトのジェスチャーでは、距離または時間のいずれかに制限があります。

4
eli_slade

次の方法でビュー修飾子を作成できます。

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
                })
    }
}

これで次のように使用できます:

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