如何设置SwiftUI嵌套DisclosureGroup的内层为不可展开状态
实现方案
方案1:基于原生DisclosureGroup实现不可展开(保留原有样式)
原生即可实现该需求,不需要引入第三方组件,修改内层DisclosureGroup的配置即可:
- 固定为持续展开状态传
.constant(true),固定为持续收起状态传.constant(false) - 不需要保留Header自定义交互的场景下,追加
.allowsHitTesting(false)完全阻断点击交互,即可彻底移除展开能力
修改后的内层代码示例:
// Make non expanable DisclosureGroup(isExpanded: .constant(true)) { ForEach(Array(tasks.enumerated()), id:\.1.title) { (index, check) in // Content } } label: { // Header } .allowsHitTesting(false)
如果你的内层Header需要响应自定义点击事件,不要使用allowsHitTesting(false),改用自定义空setter的Binding即可,不会影响Header本身的交互响应:
DisclosureGroup(isExpanded: Binding<Bool>( get: { true }, set: { _ in } )) { // 内容 } label: { // 支持自定义点击的Header }
方案2:更轻量的替代方案(无展开箭头样式)
如果你不需要DisclosureGroup自带的折叠箭头、默认嵌套缩进样式,完全没必要使用DisclosureGroup组件,直接用VStack组合Header和内容即可,性能开销更低:
VStack(alignment: .leading, spacing: 8) { // 原Header内容 ForEach(Array(tasks.enumerated()), id:\.1.title) { (index, check) in // Content } } .padding(.leading, 16) // 按需调整缩进匹配外层DisclosureGroup的嵌套效果
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

