Как запустить код, когда начинаются распознаватели жестов swiftui - PullRequest
1 голос
/ 20 января 2020

SwiftUI MagnificationGesture и DragGesture имеют API-интерфейсы .onChanged и .onEnded, но ничего не нужно проверять при запуске жеста, как в UIKit. Несколько способов, как я думал, сделать это:

  • .$gestureStarted bool в onChanged и затем установить его обратно в false в .onEnded
  • использовать последовательность жестов с касанием.

Мне не хватает какого-то предпочтительного способа сделать это? Похоже, довольно естественная вещь, чтобы хотеть проверить.

1 Ответ

2 голосов
/ 20 января 2020

Существует специальное @GestureState, которое можно использовать для таких целей. Итак, здесь возможен подход

struct TestGestureBegin: View {

    enum Progress {
        case inactive
        case started
        case changed
    }
    @GestureState private var gestureState: Progress = .inactive // initial & reset value

    var body: some View {
        VStack {
            Text("Drag over me!")
        }
        .frame(width: 200, height: 200)
        .background(Color.yellow)
        .gesture(DragGesture(minimumDistance: 0)
            .updating($gestureState, body: { (value, state, transaction) in
                switch state {
                    case .inactive:
                        state = .started
                        print("> started")
                    case .started:
                        state = .changed
                        print(">> just changed")
                    case .changed:
                        print(">>> changing")
                }
            })
            .onEnded { value in
                print("x ended")
            }
        )
    }
}
...