SwiftUI同时使用三类手势时DragGesture拖拽卡顿问题如何解决
卡顿原因
当前多个手势为平级识别关系,系统默认需要先等待0.5秒判断是否触发长按手势,再判断是否为点击手势,最后才响应拖拽动作,因此拖拽启动时会有明显延迟,表现为卡顿。
解决方案
将拖拽手势设置为高优先级,让系统优先判断拖拽动作,只要满足拖拽的最小触发距离就立即响应,无需等待长按、点击的识别判断。同时可以适当调大拖拽的最小触发距离,避免轻微触碰被误判为拖拽,影响其他手势的正常使用。
修改后的完整代码如下:
struct MyView: View { @State private var viewOffset = CGSize.zero var body: some View { VStack{ Text("HEYOOOO") .padding() } .offset(viewOffset) .onTapGesture { // 原有条目滚动逻辑 } .onLongPressGesture(minimumDuration: 0.5) { // 原有弹出菜单逻辑 // xxx = true } // 核心修改:将普通gesture改为highPriorityGesture,提升拖拽优先级 .highPriorityGesture( // 最小触发距离从0.2调整为2,单位为point,减少误触 DragGesture(minimumDistance: 2) .onChanged{ gesture in if gesture.translation.width > 0 { viewOffset.width = gesture.translation.width } } .onEnded{ _ in viewOffset = .zero } ) } }
补充说明
如果该视图嵌套在滚动列表中,还需注意和列表自带的滚动手势冲突,可以通过添加.exclusively(before:)修饰符组合手势,进一步明确不同手势的触发顺序。
内容的提问来源于stack exchange,提问作者TuracBey
相关产品推荐
相关产品推荐

