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

如何在视图上使用SwiftUI检测上下左右滑动,swiftui,swipe,apple-watch,Swiftui,Swipe,Apple Watch,我正在开发Apple Watch应用程序 我目前正在做的工作将要求我利用检测四个主要方向的滑动(向上,向下,左和右) 问题是我不知道如何检测这个。我一直在四处寻找,我已经走到了死胡同 当用户在视图上向上滑动up时,我可以对下面的视图做些什么来只打印向上滑动的 struct MyView: View { var body: some View { Text("Hello, World!") } } 谢谢。您可以使用DragGesture .gesture(Drag

我正在开发Apple Watch应用程序

我目前正在做的工作将要求我利用检测四个主要方向的滑动(
向上
向下

问题是我不知道如何检测这个。我一直在四处寻找,我已经走到了死胡同

当用户在视图上向上滑动
up
时,我可以对下面的视图做些什么来只打印向上滑动的

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

谢谢。

您可以使用
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
                        }
                    }))
.signature(DragGesture(最小距离:0,坐标空间:。本地)
.onEnded({中的值
如果value.translation.width<0{
//左
}
如果value.translation.width>0{
//对
}
如果value.translation.height<0{
//向上
}
如果value.translation.height>0{
//向下
}
}))

如果您想要一个对刷卡方向性更“宽容”的刷卡,您可以使用更多的条件来帮助平衡:

编辑:做了一些更多的测试,显然第二个条件的值增加了一些混乱,所以我调整了它们以消除所说的混乱,并使手势防弹(拖动到角落将出现“无线索”而不是其中一个手势)

let detectiondirectionaldrags=DragGesture(最小距离:3.0,坐标空间:。本地)
.onEnded{中的值
打印(值.翻译)
如果value.translation.width<0&&value.translation.height>-30&&value.translation.height<30{
打印(“左扫”)
}
否则,如果value.translation.width>0&&value.translation.height>-30&&value.translation.height<30{
打印(“右扫”)
}
否则,如果value.translation.height<0&&value.translation.width<100&&value.translation.width>-100{
打印(“向上滑动”)
}
否则,如果value.translation.height>0&&value.translation.width<100&&value.translation.width>-100{
打印(“向下滑动”)
}
否则{
打印(“无线索”)
}

由于其他解决方案在物理设备上有点不一致,我决定提出另一个解决方案,它似乎在不同的屏幕尺寸上更加一致,因为除了
最小距离之外没有硬编码值

.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")
                }
            })
.signature(DragGesture(最小距离:20,坐标空间:。全局)
.onEnded{中的值
将horizontalAmount=value.translation.width设为CGFloat
让verticalAmount=value.translation.height作为CGFloat
如果abs(水平安装量)>abs(垂直安装量){
打印(水平金额<0?“左扫”:“右扫”)
}否则{
打印(垂直安装<0?“向上滑动”:“向下滑动”)
}
})

我来试一试!谢谢:)看起来这正是我需要的!这看起来不错,但工作不正常。除非你是机器人,否则几乎不可能不生成多个响应。应该将此变量放在他们的视图中的什么位置?@soylentgraham将其放在var body:some视图之间的结构中{和return…默认情况下,swiftUI(如果您在本节中没有return语句)将返回第一个swiftUI元素(第一个ZStack/HStack/etc),但是如果您放置“return”在您的第一个swiftui元素之前,您可以添加变量,如果在var主体某些视图之前添加,通常会给您带来错误……我很震惊,这样定义行为需要非常明确的构造和容易出错的构造。滑动“感觉好吗?”在横向和纵向上?这似乎是API中的一个大漏洞。