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
})
}
}
另见
我想在 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
})
}
}
另见