【发布时间】:2020-12-21 02:34:51
【问题描述】:
我使用anchorPreferences 来设置GeometryReader 的height 以适应其内容的height。我遇到的问题是,在上下滚动List 几次后,应用程序冻结,设计变得混乱,我在控制台中收到以下消息:
Bound preference CGFloatPreferenceKey tried to update multiple times per frame.
有什么办法可以解决这个问题吗?
重要提示:我已尽可能简化我的设计。
代码如下:
struct ListAndPreferences: View {
var body: some View {
List(1..<35) { idx in
HStack {
Text("idx: \(idx)")
InnerView(idx: idx)
}
}
}
}
struct InnerView: View {
@State var height: CGFloat = 0
var idx: Int
var body: some View {
GeometryReader { proxy in
generateContent(maxWidth: proxy.frame(in: .global).size.width)
.anchorPreference(key: CGFloatPreferenceKey.self, value: Anchor<CGRect>.Source.bounds, transform: { anchor in
proxy[anchor].size.height
})
}
.frame(height: height)
.onPreferenceChange(CGFloatPreferenceKey.self, perform: { value in
height = value
})
}
private func generateContent(maxWidth: CGFloat) -> some View {
VStack {
HStack {
Text("hello")
.padding()
.background(Color.purple)
Text("world")
.padding()
.background(Color.purple)
}
}
.frame(width: maxWidth)
}
}
struct CGFloatPreferenceKey: PreferenceKey {
static var defaultValue: CGFloat = 0
static func reduce(value: inout CGFloat , nextValue: () -> CGFloat) {
value = nextValue()
}
}
【问题讨论】:
标签: swiftui swiftui-list geometryreader