如何在视图内容更改时阻止 SwiftUI DragGesture 死亡
How to stop SwiftUI DragGesture from dying when View content changes
在我的应用程序中,我水平拖动 View
来设置模型对象的位置。我也可以向下拖动它并释放它以删除模型对象。当它被向下拖得足够远时,我会通过改变它的外观来表示删除的可能性。问题是此更改会中断 DragGesture
。我不明白为什么会这样。
下面的示例代码演示了这个问题。您可以左右拖动浅蓝色框。如果你往下拉,它会变成 "rays" 系统图像,但是拖死了。
DragGesture
应用于尺寸为 50x50 的 ZStack
。 ZStack
应该在那个状态变化中继续存在,不是吗?为什么拖动手势会消失?
struct ContentView: View {
var body: some View {
ZStack {
DraggableThing()
}.frame(width: 300, height: 300)
.border(Color.black, width: 1)
}
}
struct DraggableThing: View {
@State private var willDeleteIfDropped = false
@State private var xPosition: CGFloat = 150
var body: some View {
//Rectangle()
// .fill(willDeleteIfDropped ? Color.red : Color.blue.opacity(0.3))
ZStack {
if willDeleteIfDropped {
Image(systemName: "rays")
} else {
Rectangle().fill(Color.blue.opacity(0.3))
}
}
.frame(width: 50, height: 50)
.position(x: xPosition, y: 150)
.gesture(DragGesture()
.onChanged { val in
print("drag changed \(val.translation)")
self.xPosition = 150 + val.translation.width
self.willDeleteIfDropped = (val.translation.height > 25)
}
.onEnded { val in
print("drag ended")
self.xPosition = 150
}
)
}
}
您需要保留最初捕获手势的内容。因此,您可以通过以下更改来实现您的目标:
ZStack {
Rectangle().fill(Color.blue.opacity(willDeleteIfDropped ? 0.0 : 0.3))
if willDeleteIfDropped {
Image(systemName: "rays")
}
}
在我的应用程序中,我水平拖动 View
来设置模型对象的位置。我也可以向下拖动它并释放它以删除模型对象。当它被向下拖得足够远时,我会通过改变它的外观来表示删除的可能性。问题是此更改会中断 DragGesture
。我不明白为什么会这样。
下面的示例代码演示了这个问题。您可以左右拖动浅蓝色框。如果你往下拉,它会变成 "rays" 系统图像,但是拖死了。
DragGesture
应用于尺寸为 50x50 的 ZStack
。 ZStack
应该在那个状态变化中继续存在,不是吗?为什么拖动手势会消失?
struct ContentView: View {
var body: some View {
ZStack {
DraggableThing()
}.frame(width: 300, height: 300)
.border(Color.black, width: 1)
}
}
struct DraggableThing: View {
@State private var willDeleteIfDropped = false
@State private var xPosition: CGFloat = 150
var body: some View {
//Rectangle()
// .fill(willDeleteIfDropped ? Color.red : Color.blue.opacity(0.3))
ZStack {
if willDeleteIfDropped {
Image(systemName: "rays")
} else {
Rectangle().fill(Color.blue.opacity(0.3))
}
}
.frame(width: 50, height: 50)
.position(x: xPosition, y: 150)
.gesture(DragGesture()
.onChanged { val in
print("drag changed \(val.translation)")
self.xPosition = 150 + val.translation.width
self.willDeleteIfDropped = (val.translation.height > 25)
}
.onEnded { val in
print("drag ended")
self.xPosition = 150
}
)
}
}
您需要保留最初捕获手势的内容。因此,您可以通过以下更改来实现您的目标:
ZStack {
Rectangle().fill(Color.blue.opacity(willDeleteIfDropped ? 0.0 : 0.3))
if willDeleteIfDropped {
Image(systemName: "rays")
}
}