UICollectionView左上对齐布局

本文介绍了如何使用Swift开发一个可自定义尺寸的左上对齐瀑布流布局库,通过UICollectionView、UIScrollView、格子复用和布局管理,解决项目中不同尺寸格子的需求。作者还提供了GitHub仓库链接以便于使用和贡献。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近完成的项目需要左上对齐的瀑布流,每个格子的尺寸不同,可以使用UICollectionView定义不同的尺寸,但是CollectionView的格子高度是相同的,我想要的是这样在这里插入图片描述
左上对齐分别是0、1、2;3、4;
当前只能自定义一个组件来完成需求。

使用UIScrollView来复用格子

注册格子类型

    public func register(_ viewClass: WidgetCollectionCell.Type?, forViewWithReuseIdentifier identifier: String) {
        registers[identifier] = viewClass
    }

提取格子

    public func dequeueReusableView(withReuseIdentifier identifier: String, for index: Int) -> WidgetCollectionCell? {
        var cell: WidgetCollectionCell?
        let reuseIdentifier = "\(identifier)_\(index)"
        if let reuseCell = outOfScreens[reuseIdentifier] {
            cell = reuseCell
        }
        if let viewClass = registers[identifier] as? WidgetCollectionCell.Type {
            cell = viewClass.init(reuseIdentifier: identifier, index: index)
        }
        if let _ = cell {
            onScreens[reuseIdentifier] = cell
            outOfScreens.removeValue(forKey: reuseIdentifier)
        }
        return cell
    }

移除不显示的格子

        var screenFrame = scrollView.bounds
        screenFrame.origin = scrollView.contentOffset
        allScreens.forEach { v in
            let reuseIdentifier = "\(String(describing: v.reuseIdentifier))_\(v.index)"
            if CGRectIntersectsRect(v.frame, screenFrame) {
                onScreens[reuseIdentifier] = v
                outOfScreens.removeValue(forKey: reuseIdentifier)
                addSubview(v)
            }else {
                onScreens.removeValue(forKey: reuseIdentifier)
                outOfScreens[reuseIdentifier] = v
                v.removeFromSuperview()
            }
        }

兼容原本的UIScrollViewDelegate

            if let d = delegate as? WidgetCollectionViewDelegate {
                widgetDelegate = d
                delegate = self
            }

然后就是布局了

上传至GitHub

github上创建lib WidgetCollection-Swift
本地创建lib
cd 到指定文件夹
pod lib create WidgetCollection-Swift
按提示输入相应内容
将创建好的lib上传WidgetCollection-Swift

pod 'WidgetCollection-Swift', :git => 'https://github.com/KevinSnoopy/WidgetCollection-Swift.git'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin写代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值