簡體   English   中英

SwiftUI:如何在動態列表或 LazyVStack 中獲取視圖框架

[英]SwiftUI: How can I get the frame of a view in a dynamic List or LazyVStack

我想在 LazyVStack 中獲取視圖的框架。 嵌入在 ScrollView 中的 LazyVStack 顯示聊天消息(文本和圖像)。

因為內容是動態大小的,所以我無法使用 GeometryReader 代理。 將 GeometryReader 放入我的 LazyVStack 會破壞布局。 (我假設是因為動態大小。)。

有沒有其他方法可以獲取 LazyVStack 中的視圖框架?

下面是我想要做的簡單表示。 理想情況下,我希望在 MessageView 中有一個 GeometryReader,但這會弄亂垂直間距。

struct ChatView: View {
    var body: some View {
        GeometryReader { geometry in
            ScrollView {
                LazyVStack {
                    ForEach(messages, id: \.id) { message in
                        MessageView(message: message)
                    }
                }
            }
        }
    }
}

struct MessageView: View {
    
    var message: Message
    
    var body: some View {
        // GeometryReader here is not possible with dynamic row heights
        if message.text != nil {
            Text(message.text!)
        } else if message.imageData != nil {
            Image(uiImage: UIImage(data: message.imageData!))  // <-- Get frame of this Image
        }
    }
}

將 MessageView 組合到 ChatView 中是不可取的,因為 MessageView 涉及很多視圖並且需要是一個獨立的結構。

您需要在要測量哪個框架的視圖背景中使用GeometryReader ,例如

var body: some View {
    if message.text != nil {
        Text(message.text!)
    } else if message.imageData != nil {
        Image(uiImage: UIImage(data: message.imageData!))
          .background(GeometryReader { gp in
             // gp.frame(in: .global)   // << eg. frame in global coordinates
          })
    }
}

另請參閱https://stackoverflow.com/a/62466397/12299030

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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