You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:51:01