指が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のデフォルトのジェスチャーでは、距離または時間のいずれかに制限があります。
次の方法でビュー修飾子を作成できます。
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!")
}
}
}