均匀对齐swiftUI堆栈中的项目

均匀对齐swiftUI堆栈中的项目,swiftui,alignment,swift5,Swiftui,Alignment,Swift5,如何使swiftUI堆栈中的项目均匀对齐以填满所有可用空间? 第一项和最后一项应在父级堆栈帧的开始/结束处笔直,如下所示: 对于那些熟悉css的人来说,所需的行为等于css3属性display:flex;证明内容:之间的空间这里是一个可能方法的演示。使用Xcode 12/iOS 14进行准备和测试 struct ItemView:View{ let值:Int var body:一些观点{ 文本(“项\(值)”) .padding() .背景(颜色.蓝色) } } 结构调整容器:视图{ 让意见

如何使swiftUI堆栈中的项目均匀对齐以填满所有可用空间? 第一项和最后一项应在父级堆栈帧的开始/结束处笔直,如下所示:


对于那些熟悉css的人来说,所需的行为等于css3属性
display:flex;证明内容:之间的空间

这里是一个可能方法的演示。使用Xcode 12/iOS 14进行准备和测试

struct ItemView:View{
let值:Int
var body:一些观点{
文本(“项\(值)”)
.padding()
.背景(颜色.蓝色)
}
}
结构调整容器:视图{
让意见:[V]
初始化(视图:V…){
self.views=视图
}
初始化(u视图:[V]){
self.views=视图
}
var body:一些观点{
HStack{
ForEach(views.index,id:\.self){i in
意见[i]
如果views.count>1&&i
你是说。。。如果不合适,某些物品将被丢弃?实际上,这不是SwiftUI中堆栈的工作方式——它们适合内容,反之亦然。你需要自定义布局来达到这个效果。不,一点也不,我的意思是空间是动态分布的。我试图阻止答案以这种方式暗示硬编码填充。所以它实际上只是关于对齐。我希望第一项的前导填充为0,最后一项的尾随填充为0。beetween中所有项目的放置方式应确保它们之间的空间相等。基本上只需在
HStack
中的项目之间添加
Spacer()
。令人惊讶的是,它竟然如此简单。视图包装器是一种优雅的方式——在这里添加一个想法,它不适用于嵌套的ForEach块,因为项视图是作为参数传递的。
struct ItemView: View {
    let value: Int
    var body: some View {
        Text("Item\(value)")
            .padding()
            .background(Color.blue)
    }
}

struct JustifiedContainer<V: View>: View {
    let views: [V]
    
    init(_ views: V...) {
        self.views = views
    }

    init(_ views: [V]) {
        self.views = views
    }
    
    var body: some View {
        HStack {
            ForEach(views.indices, id: \.self) { i in
                views[i]
                if views.count > 1 && i < views.count - 1 {
                    Spacer()
                }
            }
        }
    }
}

struct Demo_Previews: PreviewProvider {
    static var previews: some View {
        VStack {
            JustifiedContainer(
                    ItemView(value: 1),
                    ItemView(value: 2),
                    ItemView(value: 3)
            )
            JustifiedContainer([
                    ItemView(value: 1),
                    ItemView(value: 2),
                    ItemView(value: 3),
                    ItemView(value: 4)
            ])
        }
    }
}