如何在视图上使用SwiftUI检测向上,向下,向左和向右滑动

时间:2020-03-27 11:57:19

标签: swiftui swipe apple-watch

我正在构建Apple Watch应用。

我目前正在从事的工作将需要我利用检测四个主要方向(UPDOWNLEFTRIGHT)上的滑动来进行< / p>

问题是我不知道如何检测到这一点。我一直在四处张望,我已经死胡同了。

当用户在视图上滑动swiped up时,如何对下面的视图进行打印以仅打印UP

struct MyView: View {
    var body: some View {
        Text("Hello, World!")
    }
}

谢谢。

3 个答案:

答案 0 :(得分:11)

您可以使用DragGesture

.gesture(DragGesture(minimumDistance: 0, coordinateSpace: .local)
                    .onEnded({ value in
                        if value.translation.width < 0 {
                            // left
                        }

                        if value.translation.width > 0 {
                            // right
                        }
                        if value.translation.height < 0 {
                            // up
                        }

                        if value.translation.height > 0 {
                            // down
                        }
                    }))

答案 1 :(得分:8)

如果您希望更“原谅”滑动的方向性,则可以使用更多一些条件来帮助解决该问题:

编辑:做了更多的测试,显然第二个条件的值增加了一些混乱,因此我对其进行了调整以消除所说的混乱并使手势防弹(拖动到角落现在会提示“无提示”而不是手势之一)...

let detectDirectionalDrags = DragGesture(minimumDistance: 3.0, coordinateSpace: .local)
.onEnded { value in
    print(value.translation)
    
    if value.translation.width < 0 && value.translation.height > -30 && value.translation.height < 30 {
        print("left swipe")
    }
    else if value.translation.width > 0 && value.translation.height > -30 && value.translation.height < 30 {
        print("right swipe")
    }
    else if value.translation.height < 0 && value.translation.width < 100 && value.translation.width > -100 {
        print("up swipe")
    }
    else if value.translation.height > 0 && value.translation.width < 100 && value.translation.width > -100 {
        print("down swipe")
    }
    else {
        print("no clue")
    }

答案 2 :(得分:0)

由于其他解决方案在物理设备上有些不一致,我决定提出另一种解决方案,该解决方案在不同屏幕尺寸上似乎更加一致,因为除了minimumDistance之外没有其他硬编码值。

.gesture(DragGesture(minimumDistance: 20, coordinateSpace: .global)
            .onEnded { value in
                let horizontalAmount = value.translation.width as CGFloat
                let verticalAmount = value.translation.height as CGFloat
                
                if abs(horizontalAmount) > abs(verticalAmount) {
                    print(horizontalAmount < 0 ? "left swipe" : "right swipe")
                } else {
                    print(verticalAmount < 0 ? "up swipe" : "down swipe")
                }
            })