在我的 SwiftUI 应用程序中,拖放功能是一项核心功能,尤其是在经常使用它的特定屏幕上。
默认情况下,在拖动开始之前有一个小的延迟(长按),但我希望用户能够立即抓取并移动项目而无需等待。有没有一种简单的方法可以让 .draggable() 立即响应,而不需要长按?
任何指导将不胜感激!我宁愿避免使用 DragGesture 重新实现整个功能,因为我的应用程序已经使用 .draggable() 设置了。
这是我迄今为止尝试过的:
将allowHitTesting 设置为 false — 拖放根本不起作用。 尝试在正常和调试模式下运行 - 相同的行为仍然存在。 启用编辑模式 - 相同的行为仍然存在。
Text(s)
.padding()
.background(.red)
.draggable(s)
.draggable()
的默认行为有时会涉及延迟,尤其是在移动设备上,它需要在开始之前进行长按手势。要使其立即响应,您可以使用同步手势立即触发拖动。
您可以使用
DragGesture
并将其与 .gesture()
组合以获得即时拖动响应。
struct InstantDraggableView: View {
@State private var offset: CGSize = .zero // To track the position
var body: some View {
Text("Drag Me")
.padding()
.background(Color.blue)
.cornerRadius(10)
.foregroundColor(.white)
.offset(offset) // Update position based on drag
.gesture(
DragGesture()
.onChanged { gesture in
offset = gesture.translation // Update offset as user drags
}
.onEnded { _ in
// Optional: Add logic if you want to reset or constrain the drag
}
)
}
}
struct InstantDraggableView_Previews: PreviewProvider {
static var previews: some View {
InstantDraggableView()
}
}
不用依赖
.draggable()
(具有内置延迟),使用 DragGesture()
可以让您完全控制拖动行为。
如果您需要将其与其他手势(例如点击或长按)结合使用,您可以使用 .simultaneousGesture()
。