Как вы обнаруживаете событие SwiftUI touchDown без движения или продолжительности? - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь определить, когда палец впервые соприкасается с видом в SwiftUI. Я мог бы сделать это очень легко с событиями UIKit, но не могу понять это в SwiftUI.

Я пробовал DragGesture с минимальным движением 0, но он все равно не изменится, пока ваш палец не будет двигаться.

TapGesture будет работать только тогда, когда вы поднимите палец, а LongPressGesture не будет быстро срабатыватьдостаточно, независимо от того, какие параметры я установил.

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

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

Я хочу обнаружить событие touchDown, как только палец соприкасается с видом. Стандартные жесты Apple имеют ограничения по расстоянию или времени.

1 Ответ

0 голосов
/ 10 ноября 2019

Если вы объедините код из этих двух вопросов:

Как определить местоположение жеста касания в SwiftUI?

UITapGestureRecognizer - заставить его работать наПрикоснитесь, не подправьте?

Вы можете сделать что-то вроде этого:

ZStack {
    Text("Test")
    TapView {
        print("Tapped")
    }
}
struct TapView: UIViewRepresentable {
    var tappedCallback: (() -> Void)

    func makeUIView(context: UIViewRepresentableContext<TapView>) -> TapView.UIViewType {
        let v = UIView(frame: .zero)
        let gesture = SingleTouchDownGestureRecognizer(target: context.coordinator,
                                                       action: #selector(Coordinator.tapped))
        v.addGestureRecognizer(gesture)
        return v
    }

    class Coordinator: NSObject {
        var tappedCallback: (() -> Void)

        init(tappedCallback: @escaping (() -> Void)) {
            self.tappedCallback = tappedCallback
        }

        @objc func tapped(gesture:UITapGestureRecognizer) {
            self.tappedCallback()
        }
    }

    func makeCoordinator() -> TapView.Coordinator {
        return Coordinator(tappedCallback:self.tappedCallback)
    }

    func updateUIView(_ uiView: UIView,
                      context: UIViewRepresentableContext<TapView>) {
    }
}

class SingleTouchDownGestureRecognizer: UIGestureRecognizer {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        if self.state == .possible {
            self.state = .recognized
        }
    }
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
        self.state = .failed
    }
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
        self.state = .failed
    }
}

Мы определенно можем сделать некоторые абстракции, чтобы использование было больше похоже надругие жесты SwiftUI, но это только начало. Надеюсь, в какой-то момент Apple создаст поддержку для этого.

...