首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI:如何在动态列表或LazyVStack中获取视图框架

SwiftUI:如何在动态列表或LazyVStack中获取视图框架
EN

Stack Overflow用户
提问于 2021-04-24 19:06:10
回答 1查看 324关注 0票数 1

我想在LazyVStack中得到视图的框架。嵌入在ScrollView中的LazyVStack显示聊天消息(文本和图像)。

因为内容是动态调整大小的,所以我不能使用GeometryReader代理。在我的LazyVStack中放置一个GeometryReader会破坏布局。(我假设是因为动态调整大小。)。

有没有其他方法可以在LazyVStack中获得视图的框架?

下面是我想要做的事情的简单表示。理想情况下,我希望在MessageView中有一个GeometryReader,但这会弄乱垂直间距。

代码语言:javascript
复制
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涉及很多视图,并且需要是一个独立的结构。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-24 19:20:21

您需要在视图背景中使用GeometryReader来测量您想要测量的帧,例如

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67242086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档