为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
相关产品推荐
相关产品推荐

