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

为ScrollView添加修饰符:禁用内容交互但保留滚动功能

解决方案:禁用ScrollView内按钮同时保留滚动(无需修改内部结构)

方案一:使用内置的.disabled修饰符(最简单)

直接修改你的ScrollHitModifier,用disabled(true)替代allowsHitTesting(false)。这个修饰符会自动禁用内部所有可交互控件(比如Button),但不会影响ScrollView的滚动功能:

struct ScrollHitModifier: ViewModifier {
    func body(content: Content) -> some View {
        content
            .disabled(true)
    }
}

使用方式不变,此时ScrollViewButtonDisableView内的按钮会被禁用(点击无响应,且视觉上呈现禁用状态),但ScrollView仍可正常滚动。

方案二:保留按钮视觉样式,仅拦截点击事件

如果你需要按钮保持原本的视觉状态(不变灰),可以通过添加透明overlay拦截点击事件,同时允许滚动拖拽事件传递给ScrollView:

struct DisableButtonsPreserveScrollModifier: ViewModifier {
    func body(content: Content) -> some View {
        content
            .overlay(
                Color.clear
                    // 优先拦截点击事件,阻止按钮响应
                    .highPriorityGesture(TapGesture().onEnded { _ in })
                    // 允许滚动拖拽事件同时传递给下方的ScrollView
                    .simultaneousGesture(DragGesture(minimumDistance: 0))
            )
    }
}

使用时替换原修饰符:

struct ContentView1: View {
    var body: some View {
        ScrollViewButtonDisableView()
            .modifier(DisableButtonsPreserveScrollModifier())
    }
}

这个方案中,按钮外观和正常状态一致,但点击不会触发动作,ScrollView的滚动功能完全保留。

内容的提问来源于stack exchange,提问作者Pete

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:33:14