SwiftUI iOS13情况下实现类似于CollectionView的效果

Posted ZH_CQ_iOS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SwiftUI iOS13情况下实现类似于CollectionView的效果相关的知识,希望对你有一定的参考价值。

ios 14 Swift2.0是有个LazyVGrid和LazyHGrid这里就不提了

iOS13的情况下是不能使用这两个的

所以只能自己去实现

代码如下:

首先先对集合类型进行一个扩展 进行查找

extension Collection {

    func group(by size: Int) -> [[Element]]? {

            // Inspired by: https://lodash.com/docs/4.17.4#chunk

            guard size > 0, !isEmpty else { return nil }

            var start = startIndex

            var slices = [[Element]]()

            while start != endIndex {

                let end = index(start, offsetBy: size, limitedBy: endIndex) ?? endIndex

                slices.append(Array(self[start..<end]))

                start = end

            }

            return slices

        }

}

 

struct MyGrid<Content: View, T: Hashable>: View {

    

    private let columns: Int   //行数

    private var list: [[T]] = []  //你的数据源

    private let content: (_ index: Int,_ element: T) -> Content

    

    init(columns: Int, list: [T], @ViewBuilder content:@escaping (_ index: Int,_ element: T) -> Content) {

        self.columns = columns

        self.content = content

        self.list = list.group(by: columns) ?? []

    }

 

    var body: some View {

        VStack(alignment: .leading, spacing: 0.0) {

            ForEach(0 ..< self.list.count, id: \\.self) { i  in

                HStack {

                    ForEach(self.list[i].indices, id: \\.self) { index in

                        self.content(i * columns + index , self.list[i][index])

                            .frame(width:(UIScreen.main.bounds.size.width ) / columns)

                    }

                }

            }

        }

    }

}

调用如下:

//columns 每行有几个 list数据源

MyGrid(columns: 2, list: appDataCache.goodsList) { index,goods  in

//下面的这部分你可以理解成自定义的collectionViewCell

                                        memberSelectBtn()

                                            .padding(.top,20)

                                            .padding(.leading,24)

                                            .padding(.trailing,24)

                                            .onTapGesture {

                                            }

                                    }.padding(.top,12)

以上是关于SwiftUI iOS13情况下实现类似于CollectionView的效果的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI iOS13情况下实现类似于CollectionView的效果

SwiftUI iOS13情况下实现类似于CollectionView的效果

如何在没有导航回溯的情况下启动 SwiftUI 视图?

SwiftUI 和 iOS 15 中的新功能:LocationButton

在 iOS 13 上以编程方式滚动 SwiftUI ScrollView

在不使用导航链接的情况下获取 SwiftUI 列表中的选定项目