![](/img/trans.png)
[英]SwiftUI - How to get GeometryReader size/height from different View?
[英]SwiftUI: Initialize view after GeometryReader provides final size (iOS vs macOS)
我有一個在初始化時需要知道其父級大小的視圖。 這是代碼的簡化示例,其中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
會更新四次。 前三倍大小是錯誤的,只有第四倍大小是正確的。
在這個例子中,這並不重要,但在我的應用程序中,布局和動畫取決於從一開始就知道父視圖的正確大小。
有什么想法可以確保僅在 macOS 上提供最終大小時才初始化Text
?
在擺弄了一段時間后,我嘗試使用 Asperi 在此答案中描述的自定義幾何閱讀器: https ://stackoverflow.com/a/69931609/14542345 使用此CustomGeometryReaderView
將立即在 macOS 上提供正確的大小,即很棒,它也適用於 iOS。
不幸的是,我在動畫大小更改時遇到了問題。 由於尺寸似乎比常規GeometryReader
提供的晚一些動畫被延遲(例如,在 macOS 上折疊側邊欄並且當側邊欄已經消失時視圖仍在動畫中)。
奇怪的解決方案
解決方案(老實說,我不明白為什么會這樣)是將常規GeometryReader
包裝在CustomGeometryReaderView
中,但僅使用常規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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.