SwiftUI DragGesture 仅在一个方向

Voj*_*vik 10 swiftui

我希望 SwiftUI DragGesture 仅在手势处于特定方向(水平/垂直)时启动。是否可以?

小智 8

相当老的问题,但在其他地方没有找到答案。

您可以轻松检查是向左滑动还是向右滑动,因为手势会返回其最终状态,其中包含起始位置和最终位置。

Text("Hello")
    .gesture(
        DragGesture(minimumDistance: 100)
            .onEnded { endedGesture in
                if (endedGesture.location.x - endedGesture.startLocation.x) > 0 {
                    print("Right")
                } else {
                    print("Left")
                }
            }
Run Code Online (Sandbox Code Playgroud)


Mat*_*ini 5

是的,它是通过将手势平移的两个组件(水平或垂直)之一应用于视图偏移。

这是实现为ViewModifier.

struct DraggableModifier : ViewModifier {

    enum Direction {
        case vertical
        case horizontal
    }

    let direction: Direction

    @State private var draggedOffset: CGSize = .zero

    func body(content: Content) -> some View {
        content
        .offset(
            CGSize(width: direction == .vertical ? 0 : draggedOffset.width,
                   height: direction == .horizontal ? 0 : draggedOffset.height)
        )
        .gesture(
            DragGesture()
            .onChanged { value in
                self.draggedOffset = value.translation
            }
            .onEnded { value in
                self.draggedOffset = .zero
            }
        )
    }

}
Run Code Online (Sandbox Code Playgroud)

演示:

struct ContentView: View {

    var body: some View {
        VStack {
            Spacer(minLength: 100)
            HStack {
                Rectangle()
                    .foregroundColor(.green)
                    .frame(width: 100, height: 100)
                    .modifier(DraggableModifier(direction: .vertical))
                Text("Vertical")
            }
            Spacer(minLength: 100)
            Rectangle()
                .foregroundColor(.red)
                .frame(width: 100, height: 100)
                .modifier(DraggableModifier(direction: .horizontal))
            Text(verbatim: "Horizontal")
            Spacer(minLength: 100)
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

结果

在此处输入图片说明

  • 嗨马特奥。感谢您的回答,但这并不完全是我想要的。我希望手势**开始**仅在特定方向上进行识别。典型的 UIKit 实现将使用“gestureRecognizerShouldBegin”,如果方向错误则返回“false”。您的解决方案始终开始识别并仅应用特定轴上的偏移。 (3认同)
  • 如果看起来我不考虑别人的时间,我很抱歉,那绝对不是我做的事情。我非常欣赏马泰奥的回答,但我认为这个问题已经足够清楚了。我询问“SwiftUI DragGesture 仅当手势位于特定方向时**开始**”。现在,经过一段时间后,我同意这个问题可以得到更好的表述。我要接受这个答案。感谢 Punkbit 指出这一点。 (2认同)