swift - Swift UI 将 VStack 子项高度调整为内容高度
问题描述
我有一个带三个孩子的 VStack。这些孩子中的每一个都有一个 HStack,左边有一些文本和一个空白区域。这是预览的屏幕截图,其中 VStack 子项周围带有突出显示的边框,每个 HStack 周围都有突出显示的边框。
如何将每个 VStack 子项设置为缩小到 HStack 的高度并摆脱底部的空白空间?现在这个问题似乎是由默认情况下 VStack 填充整个屏幕并将每个孩子设置为相等的高度引起的。
当前代码:
import Foundation
import SwiftUI
struct NameAndConnection: View {
var body: some View {
VStack(alignment: .leading) {
Text(data.name)
.font(.headline)
.fontWeight(.semibold)
.foregroundColor(Color.black)
.frame(alignment: .leading)
Text(data.connection)
.font(.callout)
.fontWeight(.medium)
.foregroundColor(Color.gray)
.frame(alignment: .leading)
}
}
}
struct Description: View {
var body: some View {
Text(data.description)
}
}
struct Post: View {
var body: some View {
GeometryReader { geo in
HStack(alignment: .top, spacing: 0) {
Spacer()
VStack(alignment: .leading) {
NameAndConnection()
Description()
.padding(.top, 1.0)
}
.frame(width: geo.size.width * 0.75)
}
}
}
}
struct PostView: View {
var body: some View {
GeometryReader { geo in
VStack() {
Post()
Post()
Post()
}
}
}
}
解决方案
GeometryReader
将占用所有可用空间。一般来说,尝试GeometryReader
谨慎使用并针对不同的屏幕尺寸提出其他更灵活的解决方案被广泛认为是一种好的做法。
当您必须使用它时,通常测量 a 的背景会很有帮助View
- 这样,它View
本身就不会像GeometryReader
在前景中那样增长。我借用了GeometryReader
:https ://stackoverflow.com/a/59733037/560942
删除GeometryReader
s 后,您可以使用 aSpacer
将其他VStack
s 推到屏幕顶部。
struct GeometryGetter: View {
@Binding var rect: CGRect
var body: some View {
GeometryReader { (g) -> Path in
print("width: \(g.size.width), height: \(g.size.height)")
DispatchQueue.main.async {
self.rect = g.frame(in: .global)
}
return Path() // could be some other dummy view
}
}
}
struct Post: View {
@State private var rect1: CGRect = CGRect()
var body: some View {
HStack(alignment: .top, spacing: 0) {
Spacer()
VStack(alignment: .leading) {
NameAndConnection()
Description()
.padding(.top, 1.0)
}.frame(width: rect1.width * 0.75)
}
.background(GeometryGetter(rect: $rect1))
.border(Color.green)
}
}
struct ContentView: View {
var body: some View {
VStack() {
Post()
Post()
Post()
Spacer()
}
}
}
推荐阅读
- shell - 如何在命令行中获取 kafka 主题的启动时间
- sql - 在 SQL Server 中更新 XML 数据
- python - python-magic 包是否可以检查格式为 .mp4 的视频文件的 mime 类型?
- c++ - 点周围的最小凸多边形
- jquery - 使用spring boot从html页面创建PDF
- gremlin - 如何在亚马逊海王星中删除图表
- visual-studio - 在 Visual Studio 2017 中未显示设计器拖放选项以使用 xamarin 制作移动应用程序
- c++ - 在 std::map 中替换现有条目并添加新条目
- swift - 文件中的 Swift Shell 命令回显
- jakarta-mail - Expunge 导致 Message 对象在被删除的消息之后重新编号