我正在处理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)
}
}
1条答案
按热度按时间juzqafwq1#
看起来是那个按钮占据了你看到的白色,当点击那里时,它会继续调用按钮代码。
我不能告诉你如何使用
.frame()
修改器来解决这个问题,但我可以提供一个替代方案:if
如果你只是简单地使用一个
if
条件来显示/隐藏视图,它会按照你所期望的那样工作:另一个问题是,添加具有相同值的项也将具有相同的标识符,尽管我假设这只是为了演示该问题。
希望这有帮助:)