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

5 篇文章 0 订阅
4 篇文章 0 订阅

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS的CollectionView是一种强大的界面展示控件,它允许我们展示多个横向或纵向滚动的项。而Section Header是CollectionView中的一个重要组成部分,它可以用来展示每个分区的标题或其他相关信息。 在iOS中使用CollectionView的时候,我们可以通过实现UICollectionViewDelegateFlowLayout协议来设置每个分区的大小、间距等布局属性。而Section Header则需要通过实现UICollectionViewDelegate的collectionView:viewForSupplementaryElementOfKind:atIndexPath:方法来自定义。 首先,我们需要创建一个UICollectionReusableView类的子类作为Section Header的视图。然后,在collectionView:viewForSupplementaryElementOfKind:atIndexPath:方法中,我们需要判断elementKind是否为UICollectionElementKindSectionHeader,并根据需要从重用队列中获取Section Header的视图对象。 接下来,我们可以设置Section Header的标题、背景色、字体颜色等视觉效果。例如,我们可以使用UILabel来展示标题,并通过设置UILabel的text属性来显示每个分区的标题。如果需要更加丰富的自定义效果,我们还可以使用自定义的视图来展示Section Header。 最后,我们需要在UICollectionViewFlowLayout中设置sectionHeadersPinToVisibleBounds属性为true,以便在滚动时固定Section Header的位置。这样,当用户滚动CollectionView时,Section Header会始终显示在顶部,增加了用户的使用体验。 综上所述,iOS的CollectionView提供了强大的支持来展示多个滚动项,而Section Header则可以用来展示每个分区的相关信息。通过实现UICollectionViewDelegate的collectionView:viewForSupplementaryElementOfKind:atIndexPath:方法,我们可以自定义Section Header的视图,并通过UICollectionViewFlowLayout来设置其布局等属性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值