簡體   English   中英

SwiftUI:在 GeometryReader 提供最終大小后初始化視圖(iOS 與 macOS)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM