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

SwiftUI中如何禁用ScrollView局部区域的滚动响应

SwiftUI实现ScrollView局部区域不响应滚动手势但随滚动移动

要实现你要的效果,核心是让绿色区域(承载SpriteView)优先处理自身触摸事件,同时不触发ScrollView的滚动手势,且保持该区域属于ScrollView的一部分随滚动移动。可以通过高优先级手势抢占的方式实现:

struct ContentView: View {
    var body: some View {
        ScrollView {
            VStack(spacing: 0) {
                // 红色区域1 - 正常响应滚动手势
                Rectangle()
                    .fill(.red)
                    .frame(height: 300)
                
                // 绿色区域 - 不响应ScrollView滚动手势,但自身可处理触摸
                ZStack {
                    Rectangle()
                        .fill(.green)
                    // 替换为你的SpriteView
                    // SpriteView(scene: YourGameScene())
                }
                .frame(height: 300)
                .highPriorityGesture(
                    DragGesture(minimumDistance: 0)
                        .onChanged { _ in }
                        .onEnded { _ in }
                )
                
                // 红色区域2 - 正常响应滚动手势
                Rectangle()
                    .fill(.red)
                    .frame(height: 300)
            }
        }
    }
}

原理说明:

  • 给绿色区域添加highPriorityGesture的拖拽手势(最小距离设为0,确保任何触摸都能触发),这个手势会优先于ScrollView的滚动手势被识别,从而阻止ScrollView在该区域响应滚动。
  • 绿色区域内的SpriteView依然可以正常处理自身的触摸事件,因为高优先级手势只是拦截了滚动手势,不会影响子视图的手势传递。
  • 绿色区域作为ScrollView的直接子视图,会自然跟随ScrollView的滚动偏移一起移动,完全属于ScrollView的滚动内容。

如果你的SpriteView需要处理特定触摸类型(比如点击、长按),也可以把高优先级手势换成对应的类型,核心是让绿色区域的手势优先级高于ScrollView的滚动手势即可。


内容的提问来源于stack exchange,提问作者Dusan.czh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:55:14