ios SwiftUI:可变高度的子视图列表占用额外空间

pbossiut  于 2023-03-24  发布在  iOS
关注(0)|答案(1)|浏览(184)

我正在处理SwiftUI中一个非常奇怪的问题。基本上,我试图拥有一个子视图列表(Collapsible(),在下面的代码中),其中每个视图都可以在点击时展开和折叠。此外,这些视图为items状态变量中的每个item显示一个HStack,还有一个按钮,每次点击可以添加一个额外的项目。每个Collaspible()看起来像这样:

现在,我想在列表中显示这些Collapsible。在下面的代码中,我以非常简单的方式添加了三个:

struct ContentView: View {

    var body: some View {
        List {
            Collapsible()
            Collapsible()
            Collapsible()
        }
    }
}

它最终看起来像这样:

这就是问题所在。如果我展开其中一个可折叠组件并添加一些项目,会发生以下情况:

列表为Collapsible()分配了额外的空间,即使当它没有扩展时,maxHeight也是0。有人知道为什么会发生这种情况以及如何避免它吗?
下面是Collapsible()结构的代码。

struct Collapsible: View {
    @State private var isExpanded: Bool = false
    @State private var items: [String] = ["item1", "item2", "item3"]
    
    var body: some View {
        VStack {
            HStack {
                Text("Tap Me")
                Spacer()
                Text("Info")
            }
            .contentShape(Rectangle())
            .onTapGesture {
                isExpanded.toggle()
            }
            
            VStack {
                ForEach(items, id: \.self) { item in
                    HStack {
                        Text("Item")
                        Spacer()
                        Text("Info")
                    }
                    .padding(.vertical, 5)
                }
                
                Button("Add Item") {
                    items.append("new item")
                }
            }
            .frame(maxHeight: isExpanded ? .none : 0)
            .clipped()
        }
        .background(Color.cyan)
    }
}
juzqafwq

juzqafwq1#

看起来是那个按钮占据了你看到的白色,当点击那里时,它会继续调用按钮代码。
我不能告诉你如何使用.frame()修改器来解决这个问题,但我可以提供一个替代方案:if
如果你只是简单地使用一个if条件来显示/隐藏视图,它会按照你所期望的那样工作:

if isExpanded {
    VStack {
        ForEach(items, id: \.self) { item in
            HStack {
                Text("Item")
                Spacer()
                Text("Info")
            }
            .padding(.vertical, 5)
        }
            
        Button("Add Item") {
            items.append("new item")
        }
    }
}

另一个问题是,添加具有相同值的项也将具有相同的标识符,尽管我假设这只是为了演示该问题。
希望这有帮助:)

相关问题