gpt4 book ai didi

SwiftUI anchor 偏好折叠其 View 的高度

转载 作者:行者123 更新时间:2023-12-04 07:16:07 24 4
gpt4 key购买 nike

我正在使用 SwiftUI 并且我试图忽略 height从 subview 到其父 View 。我的理解是使用类似 PreferenceKey 的东西连同 .anchorPreference然后使用 .onPreferenceChange 对更改采取行动.
但是,由于缺乏 Apple 端的文档,我不确定我是否正确使用它,或者这是否是框架的错误。
本质上,我想要一个可以根据其内容增长或缩小的 View ,但是,我想限制它的大小,所以它不会增长超过 300 pts 垂直。之后,任何剪辑的内容都可以通过其 ScrollView 访问。 .
问题是高度的值始终为零,但我得到了正确的宽度值。

struct SizePreferenceKey: PreferenceKey {
static var defaultValue: CGSize = .zero

static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
value = nextValue()
}
}

VStack {
GeometryReader { geometry in
VStack(alignment: .leading) {
content()
}
.padding(.top, 10)
.padding([.leading, .bottom, .trailing], 20)
.anchorPreference(key: SizePreferenceKey.self, value: .bounds, transform: { geometry[$0].size })
}
}
.onPreferenceChange(SizePreferenceKey.self) { self.contentHeight = $0.height }

最佳答案

当您想获得内容的大小时,您需要从内容内部而不是父可用空间外部读取它......在您的情况下,您可以从内容的背景中执行此操作(因为内容本身是未知的),例如

VStack(alignment: .leading) {
content()
}
.padding(.top, 10)
.padding([.leading, .bottom, .trailing], 20)
.background(GeometryReader { geometry in
Color.clear
.anchorPreference(key: SizePreferenceKey.self, value: .bounds, transform: { geometry[$0].size })

})
.onPreferenceChange(SizePreferenceKey.self) { self.contentHeight = $0.height }
注: content()应该自己确定大小,否则你会在 ScrollView 中遇到鸡蛋问题

关于SwiftUI anchor 偏好折叠其 View 的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68749099/

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