如何在 HStack 中创建元素宽度相等的 VStack?

How to create VStack within HStack with equal element widths?

提问人:Bartłomiej Semańczyk 提问时间:11/15/2023 最后编辑:RobBartłomiej Semańczyk 更新时间:11/16/2023 访问量:107

问:

这是我为全宽父级创建等宽度元素的代码:HStackView

HStack(alignment: .center, spacing: 0) {
    ForEach(0...6, id: \.self) { _ in
        Color(UIColor.white.withAlphaComponent(0.1))
            .cornerRadius(5)
            .padding(2)
            .frame(minWidth: 0, maxWidth: .infinity)
            .frame(minHeight: 0, maxHeight: .infinity)
    }
}
.frame(minWidth: 0, maxWidth: .infinity)
.frame(height: 70)

效果是:

enter image description here

但是现在我需要在顶部的每个文本中添加中心文本,因此我只需将视图替换为视图,然后:"T"ViewColorVStack

HStack(alignment: .center, spacing: 0) {
    ForEach(0...6, id: \.self) { _ in
        VStack(alignment: .center) {
            Text("T")
        }
        .background(Color(UIColor.white.withAlphaComponent(0.1)))
        .cornerRadius(5)
        .padding(2)
        .frame(minWidth: 0, maxWidth: .infinity)
        .frame(minHeight: 0, maxHeight: .infinity)
    }
}
.frame(minWidth: 0, maxWidth: .infinity)
.frame(height: 70)

效果是错误的。为什么?

enter image description here

如何保持矩形视图的大小,就像没有一样?"T""T"

iOS Swift SwiftUI

评论

1赞 timbre timbre 11/15/2023
您是否尝试先定义帧大小,然后定义背景?有时修饰符的顺序很重要,我认为就是那个时候。即。VStack{...}.frame(maxWidth: .infinity, maxHeight: .infinity).background(Color...)
0赞 Bartłomiej Semańczyk 11/15/2023
认真地?好吧,让我先试试......

答:

0赞 trojanfoe 11/16/2023 #1

我认为你想要和:scaledToFill()VStackHStack

HStack(alignment: .center, spacing: 0) {
    ForEach(0...6, id: \.self) { _ in
        VStack(alignment: .center) {
            Text("T")
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .background(Color(UIColor.white.withAlphaComponent(0.1)))
        .cornerRadius(5)
        .padding(2)
        .scaledToFill()
    }
}
.frame(maxWidth: .infinity, idealHeight: 70)
.scaledToFill()

enter image description here

正如@timbre所指出的那样,设置的位置确实会有所不同.frame()

0赞 Rob 11/16/2023 #2

我可能会建议观看 WWDC 2019 使用 SwiftUI 构建自定义视图,因为这个视频(尤其是前半部分)概述了基本的布局过程,说明了文本字段如何仅请求它们需要的空间。

但在这种情况下,正如音色所说,顺序很重要。只需先设置视图:frameVStack


struct ContentView: View {
    var body: some View {
        HStack(alignment: .center, spacing: 0) {
            ForEach(0...6, id: \.self) { _ in
                VStack(alignment: .center) {
                    Text("T")
                }
                .frame(minWidth: 0, maxWidth: .infinity)
                .frame(minHeight: 0, maxHeight: .infinity)
                .background(Color.white.opacity(0.1))       // we don’t need UIColor
                .cornerRadius(5)
                .padding(2)
            }
        }
        .frame(minWidth: 0, maxWidth: .infinity)
        .frame(height: 70) 
    }
}

enter image description here

0赞 Gautier 11/16/2023 #3

在这里,您想使用覆盖层来实现您要实现的目标:

        HStack(alignment: .center, spacing: 0) {
            ForEach(0...6, id: \.self) { _ in
                Color.red.opacity(0.1)
                    .overlay {
                        Text("T")
                    }
                    .cornerRadius(5)
                    .padding(2)
            }
        }
        .frame(height: 70)

您不需要修饰符,因为默认情况下已经占用了所有可用空间。如果您不希望背景中有任何颜色,请将其设置为 。.frame(minWidth: 0, maxWidth: .infinity)Color.clear

评论

0赞 Gautier 11/16/2023
这就是我在“如何保持带有”T“的矩形视图的大小,就像没有”T“一样?此外,您可以将文本放在 VStack 中或/和在叠加层中做任何您想做的事情,它会正常工作;)
0赞 Rob 11/16/2023
对不起,我被红色误导了(他想要用“T”代替红色,而不是在红色之上)。我现在明白你在说什么了......