gpt4 book ai didi

ios - SwiftUI |如果被 ScrollView 取消,则从不调用 DragGestures onEnded

转载 作者:行者123 更新时间:2023-12-03 21:45:43 24 4
gpt4 key购买 nike

我有以下问题。
我有一个 ViewScrollView 内我想拖动。
现在,一切正常,拖动和滚动也发生了。但是一旦我尝试两者都做,dragOffset似乎停留,而不是重置到其初始位置。
更是如此,onEndedDragGesture永远不会发生。如何阻止这种情况发生并重置绿色 Rectangle到它的初始位置?
视觉表现
拖动或滚动效果很好。

但每当我两者都做时,就会发生这种情况。

演示代码

struct ContentView: View {

@State private var dragOffset: CGSize = .zero


var body: some View {
ScrollView {
Rectangle()
.frame(width: UIScreen.main.bounds.size.width, height: 300)
.foregroundColor(.green)
.offset(x: dragOffset.width)
}
.gesture(DragGesture()
.onChanged { value in
dragOffset = value.translation
}
.onEnded { value in
dragOffset = .zero
}
)
.animation(.default)
}
}
谢谢!

最佳答案

解决方法是使用 .updatingGestureState反而。在手势因某种原因取消后,它会自动将偏移量设置为其初始位置。
这样,我们就可以独立于调用 onEnded将其设置为初始位置,当您通过滚动取消手势时不会发生这种情况。

代码:

struct ContentView: View {

@GestureState private var dragOffset: CGSize = .zero


var body: some View {
ScrollView {
Rectangle()
.frame(width: UIScreen.main.bounds.size.width, height: 300)
.foregroundColor(.green)
.offset(x: dragOffset.width)
}
.gesture(DragGesture()
.updating($dragOffset) { value, state, transaction in
state = value.translation
}
)
.animation(.default)
}
}
注意:您当然仍然可以拥有 onChangedonEnded block ,您不必将偏移量设置为 .zero不再,因为它是自动发生的。
更新
如果要在 ObservableObject里面使用类并希望您的 dragOffset 被发布,然后 here would be a solution I found .

关于ios - SwiftUI |如果被 ScrollView 取消,则从不调用 DragGestures onEnded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64424719/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com