当前位置: 首页 > 知识库问答 >
问题:

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

赫连正初
2023-03-14

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

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

有没有其他方法来获得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涉及到许多视图,并且需要是一个独立的结构。

共有1个答案

伯庆
2023-03-14

您需要在要测量的框架的视图背景中使用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

 类似资料:
  • 问题内容: 我可以做一个静态列表 但是,如何从数组中动态生成元素列表?我尝试了以下操作,但出现错误: 包含控制流语句的闭包不能与函数生成器“ ViewBuilder”一起使用 有什么解决办法吗?我要完成的工作是一个列表,其中包含不是静态输入的动态元素集。 问题答案: 看起来答案与将我的视图包装在其中有关 这样,我现在可以从服务器获取视图数据并进行组合。而且,仅在需要时才实例化它们。

  • 我的ListView自定义适配器(及其新实现的viewHolder)有一些问题。我有一个列表视图,每个项目都有一个复选框(这里没有新内容)。问题是,如果我的列表中有超过9个项目,当我选中第一个复选框时,第十个将自动选中(第二个与第十一个相同),就像两个项目都有一个监听器一样(我认为在某种程度上是这样)。 我在这里读到了listView、视图回收和ViewHolder解决它的方法的位置问题:如何使我

  • 我对中的有一个问题。 下面是我的代码: 问题:在中按下时,会像它应该的那样消失,取而代之。但是,并不会消失,而是停留在视图B的顶部。 当更改为时,如何强制关闭?请注意,也可以由以外的其他视图更改,因此只将传递给并在单击时将其设置为false并不能完成此工作。

  • 问题内容: 我有一个显示两个相同类型的。当您点击其中一个视图时,它们会通过动画改变其高度。 但是,这些视图嵌入的对象没有动画,这会导致丑陋的毛刺,因为该行的高度会立即更改,而该行中的实际视图则具有动画效果: 我也该如何制作动画?我尝试在其中添加修饰符,但没有任何作用。 我也不想将其移出视图。该视图应该是独立的,不应依赖其他视图来控制它(我认为这就是MVVM的目的) 谢谢! 问题答案: 解决方案是通

  • 问题内容: 我想在列表上有一个反向列表视图(以与在列表上提供子列表视图类似的方式)。是否有提供此功能的功能? 我既不想复制列表,也不想修改列表。 在这种情况下,如果我至少可以在列表上获得一个反向迭代器就足够了。 另外,我知道自己如何实施。我只是问Java是否已经提供了类似的东西。 演示实现: 我刚刚发现有些实现正是我所需要的。尽管没有通用的实现。这有点奇怪,因为我所见过的实现足以与任何实现一起使用

  • 问题内容: 将内容添加到ListView时,我希望它自动向下滚动。 我正在使用SwiftUI 和a 作为控制器。新数据将追加到列表中。 当我将新数据追加到消息列表时,我希望列表向下滚动。但是,我必须手动向下滚动。 问题答案: 更新:在iOS 14中,现在有一种本机方式可以执行此操作。我正在这样做 对于iOS 13及以下版本,您可以尝试: 我发现翻转视图对我来说似乎很好。这将在底部启动ScrollV