UICollectionView左上对齐布局

news/2024/7/20 21:57:18 标签: ios, collectionview, widget

最近完成的项目需要左上对齐的瀑布流,每个格子的尺寸不同,可以使用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'

http://www.niftyadmin.cn/n/5159648.html

相关文章

7.3 等待条件变量/向条件变量发送信号

方法 pthread_cond_wait(condition,mutex) pthread_cond_signal(condition) pthread_cond_broadcast(condition) 用法 pthread_cond_wait()会阻塞调用该方法的线程,直到等待的条件变量接收到了信号。应该在对某个互斥量上锁后调用该方法,它会在阻塞线程时自动释放互斥量。…

04【保姆级】-GO语言指针

之前我学过C、Java、Python语言时总结的经验: 先建立整体框架,然后再去抠细节。先Know how,然后know why。先做出来,然后再去一点点研究,才会事半功倍。适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。对于GO语言&a…

聊聊定时器 setTimeout 的时延问题

给大家推荐一个实用面试题库 1、前端面试题库 (面试必备) 推荐:★★★★★ 地址:web前端面试题库 全局的 setTimeout() 方法设置一个定时器,一旦定时器到期,就会执行一个函数或指定的代码片…

云尘 命令执行系列

第一题 system <?php include "flag.php";if (isset($_POST[cmd])) {system($_POST[cmd]); }show_source(__FILE__);代码如上 system($_POST[cmd]); POST请求发送一个名为 cmd 的参数&#xff0c;然后将该参数的值传递给系统命令执行函数 system()&#xff0c…

【调度算法】并行机调度问题遗传算法

问题描述 m台相同的机器&#xff0c;n个工件&#xff0c;每个工件有1道工序&#xff0c;可按照任意的工序为每个工件分配一台机器进行加工 工件ABCDEFGHI工件编号012345678加工时间4765835510到达时间324532186交货期101530241413201810 设备数目&#xff1a;3 目标函数 最…

2023年起重机司机(限桥式起重机)证考试题库及起重机司机(限桥式起重机)试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年起重机司机(限桥式起重机)证考试题库及起重机司机(限桥式起重机)试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作…

利用Caddy实现http反向代理

利用Caddy实现http反向代理 1 Caddy是什么 Caddy是一个开源的&#xff0c;使用Golang编写的&#xff0c;支持HTTP/2的Web服务端。它的一个显著特征就是默认启用HTTPS。 和nginx类似。 2 多个后端服务 假如现在有3个后端http服务&#xff1a;分别在启动在 app1 http://10…

Juniper Networks Junos OS EX远程命令执行漏洞(CVE-2023-36845)

Juniper Networks Junos OS EX远程命令执行漏洞&#xff08;CVE-2023-36845&#xff09; 免责声明漏洞描述漏洞影响漏洞危害网络测绘Fofa: body"J-web" || title"Juniper Web Device Manager" 漏洞复现1. 构造poc2. 查看文件3. 执行命令 免责声明 仅用于技…