ios - SwiftUI | 如果被 ScrollView 取消,则从不调用 DragGestures onEnded
问题描述
我有以下问题。
我有一个我想拖动的View
内部。ScrollView
现在,一切正常,拖动和滚动也发生了。但是一旦我尝试两者都做,dragOffset
似乎会留下来,而不是重置到它的初始位置。
更何况,onEnded
永远DragGesture
不会发生。我怎样才能阻止这种情况发生并将果岭重置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
with 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
andonEnded
块,你只是不必再设置偏移量,.zero
因为它会自动发生。
更新
如果您要在ObservableObject
课堂上使用它并希望发布您的 dragOffset,那么这将是我找到的解决方案。
推荐阅读
- xslt - 如何在 SOA BPEL/XSLT 中遍历子节点并对其进行修改
- ruby-on-rails - 在视图中将带有插值的字符串渲染到 HAML
- python - 在 PyCharm 中调试期间如何查看异常回溯?
- c++ - 仅通过更改数据类型就会出现意外的输出
- reactjs - 是否可以将 Material UI 作为 peerDependency 但将其类型保持为 DevDependency?
- datatables - 数据表:当 Ajax 调用呈现数据时,可见选项不起作用
- python - 有没有办法在 Altair 中循环和制作情节?
- asp.net - 如何在 ASPX 页面上使用 Angular 和 WebMethod 上传文件?
- html - 为什么浮动框可以创建文本环绕效果而固定或绝对定位的框不能?
- sql - 如何为此动态 sql 添加分页