我正在构建Apple Watch应用。
我目前正在从事的工作将需要我利用检测四个主要方向(UP
,DOWN
,LEFT
和RIGHT
)上的滑动来进行< / p>
问题是我不知道如何检测到这一点。我一直在四处张望,我已经死胡同了。
当用户在视图上滑动swiped up
时,如何对下面的视图进行打印以仅打印UP
?
struct MyView: View {
var body: some View {
Text("Hello, World!")
}
}
谢谢。
答案 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")
}
})