[英]SwiftUI | DragGestures onEnded never called if canceled by ScrollView
我有以下問題。
我在ScrollView
中有一個要拖動的View
。 現在,一切正常,發生拖動和滾動。 但是,一旦我嘗試同時執行這兩項操作,則dragOffset
似乎會保持dragOffset
,而不是重置為其初始位置。
更onEnded
是, DragGesture
onEnded
永遠不會發生。 如何阻止這種情況發生並將綠色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)
}
}
謝謝!
解決方案是將.updating
與GestureState
一起使用。 無論出於何種原因取消手勢后,它都會自動將偏移設置為其初始位置。
這樣,我們獨立於調用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)
}
}
注意:您當然仍然可以有一個onChanged
和onEnded
塊,您只是不必.zero
偏移量設置為.zero
因為它會自動發生。
如果您要在ObservableObject
類中使用它並希望發布 dragOffset,那么這將是我找到的解決方案。
我認為scrollView
有自己的手勢,比如UIScrollViewPanGestureRecognizer
中的 UIScrollViewPanGestureRecognizer,在scrollView
上添加DragGesture
會混淆它。
你可以稍微改變你的代碼:
var body: some View {
ScrollView {
Rectangle()
.frame(width: UIScreen.main.bounds.size.width, height: 300)
.foregroundColor(.green)
.offset(x: dragOffset.width, y: dragOffset.height)
.gesture(DragGesture()
.onChanged { value in self.dragOffset = value.translation }
.onEnded { value in self.dragOffset = .zero }
)
}
.animation(.default)
}
我認為它可以很好地工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.