我有一个观点,需要知道它的父母的大小时,被削弱。下面是一个简化的代码示例,其中Text显示GeometryReader提供的大小。
struct ContentView: View {
var body: some View {
GeometryReader { proxy in
ZStack {
Rectangle()
.frame(maxWidth: .infinity, maxHeight: .infinity)
.foregroundColor(.blue)
Text("Size: \(proxy.size.width) x \(proxy.size.height)")
}
}
}
}当我在iOS上运行这段代码时,body只更新一次,大小从一开始就正确。当我在macOS上运行这段代码时,body会被更新四次。前三次大小是错误的,只有第四次大小是正确的。
在这个例子中,没有那么重要,但是在我的应用程序中,布局和动画取决于从一开始就知道父视图的正确大小。
有什么想法可以确保Text只有在macOS上有最终大小时才会被弱化吗?
发布于 2022-06-27 12:47:12
经过一段时间的修改之后,我尝试使用Asperi在这个答案中描述的自定义几何阅读器:使用此CustomGeometryReaderView的https://stackoverflow.com/a/69931609/14542345将立即在macOS上提供正确的大小,这是很棒的,它也适用于iOS。
不幸的是,当动画大小发生变化时,我遇到了问题。由于大小似乎比常规的GeometryReader晚一些动画被延迟(例如,在macOS上折叠侧边栏,当边栏已经消失时视图仍然是动画的)。
奇异解
解决方案(老实说,我不明白为什么会这样)是在CustomGeometryReaderView中包装常规GeometryReader,但只使用来自常规GeometryReader的值。
CustomGeometryReaderView { size in
GeometryReader { proxy in
ZStack {
Rectangle()
.frame(maxWidth: .infinity, maxHeight: .infinity)
.foregroundColor(.blue)
Text("Size: \(proxy.size.width) x \(proxy.size.height)")
}
}
}来自自定义读取器的大小从未被使用过,但它会导致常规GeometryReader只发送一次.onAppear大小,而不是再次发送三次.onChange。
https://stackoverflow.com/questions/72704975
复制相似问题