[英]How to align items to top inside VStack in SwiftUI?
我刚开始使用 swiftui,我在 ui alignment 中遇到问题。以下代码从图像顶部创建一个空格
VStack(alignment: .leading) {
Image(item.imageUrl)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 72, height: 72, alignment: .top).padding(.top,0)
Text("\(item.name)").font(Font.system(size:12, design: .default))
.multilineTextAlignment(.center)
.frame(maxWidth: .infinity).lineLimit(2)
}
}
我可以看到 VStack 接受参数alignment
,但它是水平的 alignment。我需要的是图像应该贴在其超级视图的顶部。 有没有办法在不使用 Spacer() 的情况下执行此操作。
就像在 react-native 中一样,我们曾经为子级的水平和垂直 alignment 设置了 justifyContent 和 alignItems。
更新:
文本或任何视图也存在同样的问题。 例如,这段代码将两个文本放在视图的中心
VStack(alignment: .leading, spacing: 0) {
Text("line 1")
Text("line 2")
}
VStack 中的参数 alignment 用于水平 alignment。
现在要将这些文本对齐到顶部,我能想到的唯一方法是像这样引入Spacer()
:
struct MyCustomView:View {
var body: some View {
VStack(alignment: .leading, spacing: 0) {
Text("line 1")
Text("line 2")
Spacer()
}
}
这确实暂时解决了问题:
但是 spacer 会在复杂的视图中产生问题,假设另一个开发人员想要在我的视图下方添加一个自定义视图(在本例中为第 3 行),spacer 会在它们之间创建额外的空间
VStack {
MyCustomView()
Text("line 3")
}
有没有更好的方法让我在 VStack 中的子视图(和后续视图)在没有垫片的情况下保持与顶部对齐?
您可以尝试使用.frame()
修饰符使VStack()
在其超级视图中采用全尺寸。 在框架中,您可以对齐您的内容topLeading
var body: some View {
VStack(alignment: .leading, spacing: 0) {
Text("line 1")
Text("line 2")
}
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .topLeading)
.border(Color.red)
}
该解决方案不需要垫片
SwiftUI 意见很便宜。 将另一个VStack()与Spacer()一起使用。
VStack {
VStack(alignment: .center, spacing: 0) {
Text("line 1")
Text("line 2")
// Add your Views here
}
Spacer()
}
这也有效。
VStack {
Text("line 1")
Text("line 2")
}.frame(maxWidth: .infinity, // Full Screen Width
maxHeight: .infinity, // Full Screen Height
alignment: .topLeading) // Align To top
VStack(spacing: 30) {
Text("Default Alignment in Vstack is Center")
VStack(alignment: .trailing, spacing: 20) {
Text(".trailing")
.font(.title)
Image(systemName: "rectangle.trailinghalf.inset.filled.arrow.trailing")
.font(.title)
Text("Alignment set by .trailing")
}.padding()
.background(RoundedRectangle(cornerRadius: 10).foregroundColor(.yellow))
VStack(alignment: .leading, spacing: 20) {
Text(".leading")
.font(.title)
Image(systemName: "rectangle.leadinghalf.inset.filled.arrow.leading")
.font(.title)
Text("Alignment set by .leading")
}.padding()
.background(RoundedRectangle(cornerRadius: 10).foregroundColor(.yellow))
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.