Layout SwiftUI:如何使GridItem向外推以填充可用空间

Layout SwiftUI:如何使GridItem向外推以填充可用空间,layout,swiftui,grid,lazyhgrid,Layout,Swiftui,Grid,Lazyhgrid,我想创建一个4行24项的网格,因此每行应该有6项。所有项目的大小应相同,但无论网格在哪个设备上渲染,都应填充整个可用空间 我已经为行实现了一个灵活的高度,但是GridItems并没有在水平方向上推进put,尽管它是一个形状,也就是说是向外推进的。好吧,在懒散的生活中,它似乎并没有被挤出去 这是我的代码: struct AllAchievementsView: View { var gridRows: Array<GridItem> { [GridItem(), G

我想创建一个4行24项的网格,因此每行应该有6项。所有项目的大小应相同,但无论网格在哪个设备上渲染,都应填充整个可用空间

我已经为行实现了一个灵活的高度,但是GridItems并没有在水平方向上推进put,尽管它是一个形状,也就是说是向外推进的。好吧,在懒散的生活中,它似乎并没有被挤出去

这是我的代码:

struct AllAchievementsView: View {
    
    var gridRows: Array<GridItem>  { [GridItem(), GridItem(), GridItem(), GridItem()] }

    var body: some View {
        
        ZStack {
            Color.black
            LazyHGrid(rows: gridRows) {
                ForEach(0..<24) { index in
                    RoundedRectangle(cornerRadius: 10).foregroundColor(.blue)
                }
            }.padding()
        }
    }
}
struct allachievements视图:视图{
变量gridRows:数组{[GridItem(),GridItem(),GridItem(),GridItem()]}
var body:一些观点{
ZStack{
颜色:黑色
懒鬼(行:网格行){

ForEach(0..GridItem
是根据内容大小填充/对齐的,但是
矩形没有自己的大小,因此您可以看到使用了一些最小默认值

下面是一个可能的解决方案(使用Xcode 12/iOS 14测试)

struct allachievements视图:视图{
设sp=CGFloat(5)
var gridRows:Array{Array(重复:GridItem(间距:sp),计数:4)}
var body:一些观点{
GeometryReader{gp in
ZStack{
颜色:黑色
LazyHGrid(行:网格行,间距:sp){

ForEach(0..您是否只是缺少了
aspectRatio(1,contentMode:.fit)
修饰符?就我个人而言,我不喜欢依赖
GeometryReader
的解决方案。根据您的要求,您可以简单地将
圆角的纵横比设置为16/10或1/1,以确保其具有合理的宽度。
struct AllAchievementsView: View {
    
    let sp = CGFloat(5)
    var gridRows: Array<GridItem> { Array(repeating: GridItem(spacing: sp), count: 4) }

    var body: some View {
        
        GeometryReader { gp in
            ZStack {
                    Color.black
                    LazyHGrid(rows: gridRows, spacing: sp) {
                         ForEach(0..<24) { index in
                              RoundedRectangle(cornerRadius: 10).foregroundColor(.blue)
                                .frame(width: gp.size.width / 6 - 2*sp)
                         }
                    }
                    .padding()
            }
        }
    }
}