1

我想在 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 涉及很多视图并且需要是一个独立的结构。

4

1 回答 1

1

您需要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

于 2021-04-24T11:20:21.023 回答