ios 如何在网格项的行中添加叠加

wlzqhblo  于 2023-03-24  发布在  iOS
关注(0)|答案(2)|浏览(151)

我想添加圆角矩形到整个行时,用户点击任何网格项目从该行。。我怎么能添加该矩形到整个行。。

struct ContentView: View {
    let data = [Date]

    let columns = Array(repeating: GridItem(.flexible()), count: 7)

    var body: some View {
       
            LazyVGrid(columns: columns, spacing: 20) {
                ForEach(data, id: \.self) { item in
                    Text(item.date)
                }
            }
            .padding(.horizontal)
       
    }
}

我希望得到行项目组,这样我就可以添加到它的覆盖…但我无法得到它

but5z9lq

but5z9lq1#

您可以使用堆栈组合来创建网格。每一行都可以是一个HStack,您可以使用“onTapGesture”或任何您想要更改行外观的视图修改器对其应用。
这可以是一个简单的例子:

struct ContentView: View {
    let data: [[Date]] = [Array(repeating: Date(), count: 2),
                          Array(repeating: Date(), count: 2)]
    
    var body: some View {
        ScrollView {
            LazyVStack {
                ForEach(0..<data.count, id: \.self) { row in
                    ScrollView(.horizontal) {
                        LazyHStack {
                            ForEach(0..<data[row].count, id: \.self) { column in
                                Text("\(data[row][column])")
                            }
                        }
                        .onTapGesture {
                            print("Hello World")
                        }
                    }
                }
            }
        }
    }
}

我使用滚动视图使网格可以双向滚动,但是如果不需要这种行为,可以省略它们。

piok6c0g

piok6c0g2#

我已经解决了这个问题,在过去通过打破数据到数组中的每一行,然后有一个额外的ForEach来构建行.这些然后可以被边界.有效地每行成为自己的LazyVStack.代码示例我有测试是下面.有一件事要注意的是,因为它是有效地不同的网格,如果你的数据宽度在每行不同,每行可以有不同的列间距。在这种情况下,使用固定宽度的列将在行列表(LazyVGrids)中保留这一点。

struct ContentView: View {
    let data = ["1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "11" , "12" , "13" , "14" , "15" , "16" , "17" , "18" , ]

    let columns = Array(repeating: GridItem(.flexible()), count: 7)

    var body: some View {
        ForEach(rowsArray(), id: \.self) { rowArray in
            LazyVGrid(columns: columns, spacing: 20) {
                ForEach(rowArray , id: \.self) { item in
                    Text(item)
                }
            }.border(.blue)
        }
        .padding(.horizontal)
       
    }
    
    func rowsArray() -> [[String]] {
        var rowArrays: [[String]] = [[]]
        var index = 0
        while index < data.count {
            let range = min( 7 , (data.count - index))
            let rowArray = Array( data[index..<(index + range)] )
            rowArrays.append(rowArray)
            index = index + range
        }
        return rowArrays
    }
}

相关问题