瀑布流的简单实现

详细代码请前往: https://git.oschina.net/null_248_6948/WaterfallLayout

 

extension WaterfallLayout {

    //     prepare准备所有Cell的布局样式

    override func prepare() {

        super.prepare()

        

        //         0.获取item的个数

        let itemCount = collectionView!.numberOfItems(inSection: 0)

        

        //         1.获取列数

        let cols = dataSource?.numberOfColsInWaterfallLayout?(self) ?? 2

        

        //         2.计算Item的宽度

        let itemW = (collectionView!.bounds.width - self.sectionInset.left - self.sectionInset.right - self.minimumInteritemSpacing * CGFloat((cols - 1))) / CGFloat(cols)

        

        //         3.计算所有的item的属性

        for i in startIndex..<itemCount {

            //             1.设置每一个Item位置相关的属性

            let indexPath = IndexPath(item: i, section: 0)

            

            //             2.根据位置创建Attributes属性

            let attrs = UICollectionViewLayoutAttributes(forCellWith: indexPath)

            

            //             3.随机一个高度

            guard let height = dataSource?.waterfallLayout(self, indexPath: indexPath) else {

                fatalError("请设置数据源,并且实现对应的数据源方法")

            }

            

            //             4.取出最小列的位置

            var minH = colHeights.min()!

            let index = colHeights.index(of: minH)!

            minH = minH + height + minimumLineSpacing

            colHeights[index] = minH

            

            //             5.设置item的属性

            attrs.frame = CGRect(x: self.sectionInset.left + (self.minimumInteritemSpacing + itemW) * CGFloat(index), y: minH - height - self.minimumLineSpacing, width: itemW, height: height)

            attrsArray.append(attrs)

        }

        

        //         4.记录最大值

        maxH = colHeights.max()!

        

        //         5.给startIndex重新复制

        startIndex = itemCount

    }

}

转载于:https://my.oschina.net/u/2958688/blog/799692

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值