gpt4 book ai didi

ios - 如何创建一个可以适应其子项不断变化的大小的 ScrollView

转载 作者:行者123 更新时间:2023-11-29 13:54:56 24 4
gpt4 key购买 nike

[Beta 4] 我有一个卡片列表,当用户点击它们以显示更多信息时,每张卡片都可以展开。

但是,当卡片的大小发生变化时,包含的 ScrollView 不会展开或收缩。

我发现使这项工作有效的唯一方法是使用列表——它似乎可以自动调整内容,但这不是我想要的,因为它引入了列表的其他功能(最显着的是分隔线)。

不使用 ForEach(即仅堆叠多个 Card() 会产生相同的结果。

在 Beta 3 中,我找到了一个解决方法,将 expanded 设为 @Binding,然后为每张卡片设置一个 @State 数组,但自 Beta 4 以来,这不再起作用,因为变化的值不再向上传播,除非我在父 View 中也有一个直接绑定(bind)到该数组的元素(即也是一个切换)。看起来 @State 的状态现在只有在实际有元素直接绑定(bind)到它时才会改变。

struct ExpandableChildViewTest: View {

var body: some View {

ScrollView {
VStack(alignment: .leading, spacing: 20) {
ForEach(1...10) { _ in
Card()
}
}
}
.padding()
.border(Color.green, width: 1)
}
}

struct Card: View {

@State private var expanded = true

var body: some View {

ZStack {
Rectangle()
.frame(height: expanded ? 350: 100)
.foregroundColor(Color.blue)
.cornerRadius(20)
.padding(.vertical)
.tapAction() {
self.expanded.toggle()
}
}
}
}


我希望(希望)包含的 Scrollview 在其子项更改大小时调整其大小,但这并没有发生。这会导致内容从 ScrollView 中掉出来,或者 ScrollView 中有很多额外的空间。

The picture shows the extra white space at the top because the second card is collapsed. The outer Scrollview does not recompute itself.

最佳答案

(我的名誉还不允许评论,所以我用这种方式...)我有类似的情况:具有不同粒度(十年、年、月等)的时间轴,用户应该能够平滑缩放,而比例会相应地采用。到目前为止我找到的唯一方法是计算当前放大倍数的刻度的整体宽度,并通过模型将其交给 View 。嵌入式 View 然后获得具有该宽度的 .frame,然后 ScrollView 正确处理滚动。

然而,这离优雅还差得很远。因为嵌入式 View 实际上知道它的宽度,所以应该可以通过某种方式(但如何?)让 ScrollView 知道该宽度。在我的环境中,ScrollView(没有明确的 .frame)只显示一个空屏幕,有明确的 .frame 一切都很好(但性能不够)。

顺便说一句:从 Beta 5 开始,绑定(bind)的执行方式发生了变化。您现在使用 @ObservedObject var model: Model 在 View 中设置模型,并使用 @Published var something: SomeType 传播模型的更改,这比以前容易得多.

关于ios - 如何创建一个可以适应其子项不断变化的大小的 ScrollView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57119833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com