iOS ColleCtionView 如何让cell 不重复创建并且只在展示的时候才创建

news2024/9/19 11:07:25

前言

使用 collectionView 一屏只展示一个 cell ,一次只加载当前 cell,还要能够缓存已加载过的 cell ,使 cell 不重复加载,听着好像就是将 collectionView 的复用机制禁用掉。用collectionView 实现这个需求,就出现了两个冲突点,一个是collectionView 会预加载后面的 cell ,另一个是会释放掉没在屏幕中显示的 cell 。
示例
请添加图片描述

思路

  1. 将加载过的视图用一个字典存起来
  2. 当 cell 从重用池中取出来后,将字典中存放的对应视图 加载到 cell 上展示
  3. 当从字典中没有取到对应的视图时,就去创建新视图

主要实现代码

缓存的字典

var validViewDict:[Int:CommentView] = [:]

加载 cell

  func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
        cell.contentView.subviews.forEach { $0.removeFromSuperview()}
        
        if let validView = validViewDict[indexPath.item] {
            validView.frame = cell.contentView.bounds
            cell.contentView.addSubview(validView)
        }
        
        return cell
    }

创建视图时机

   func scrollViewDidScroll(_ scrollView: UIScrollView) {
        guard scrollView.isTracking || scrollView.isDragging else {
            return
        }
        let percent = scrollView.contentOffset.x/scrollView.bounds.size.width
        let maxCount = Int(round(scrollView.contentSize.width/scrollView.bounds.size.width))
        var leftIndex = Int(floor(Double(percent)))
        leftIndex = max(0, min(maxCount - 1, leftIndex))
        let rightIndex = leftIndex + 1;
        if percent < 0 || rightIndex >= maxCount {
            return
        }
        let remainderRatio = percent - CGFloat(leftIndex)

        if rightIndex == currentIndex {
            //当前选中的在右边,用户正在从右边往左边滑动
            if validViewDict[leftIndex] == nil && remainderRatio < (1 - initListPercent) {
                initListIfNeeded(at: leftIndex)
            }
            
        }else {
            //当前选中的在左边,用户正在从左边往右边滑动
            if validViewDict[rightIndex] == nil && remainderRatio > initListPercent {
                initListIfNeeded(at: rightIndex)
                currentIndex = rightIndex
            }
        }
        
    }

创建视图并存入字典

    func initListIfNeeded(at index: Int) {
      
        var existedView = validViewDict[index]
        if existedView != nil {
            //列表已经创建好了
            return
        }
        existedView = initValidView(initViewAt: index)
        guard let commentView = existedView else {
            return
        }
        
        validViewDict[index] = commentView
        
        let cell = collectView.cellForItem(at: IndexPath(item: index, section: 0))
        cell?.contentView.subviews.forEach { $0.removeFromSuperview() }
        commentView.frame = cell?.contentView.bounds ?? CGRect.zero
        cell?.contentView.addSubview(commentView)
    }

结语

使用字典保存加载的视图,每次加载 cell 时先移除子视图,再加载字典中的视图,避免了复用带来的界面展示内容不对的问题。在滚动代理 scrollViewDidScroll 中计算创建视图的时机,保证只创建当前展示的cell 的视图。这样我们就巧妙的实现了“如何让cell 不重复创建并且只在展示的时候才创建”。


感谢您的阅读和参与,HH思无邪愿与您一起在技术的道路上不断探索。如果您喜欢这篇文章,不妨留下您宝贵的赞!如果您对文章有任何疑问或建议,欢迎在评论区留言,我会第一时间处理,您的支持是我前行的动力,愿我们都能成为更好的自己!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2049297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GD32】从零开始学GD32单片机 | PMU电源管理单元+深度睡眠和待机例程(GD32F470ZGT6)

1. 简介 PMU电源管理单元通俗讲就是用来管理MCU的电源域的&#xff0c;它主要有两个功能——电压监测和低功耗管理。在GD32中一共有3个电源域——VDD/VDDA域、1.2V域和备份域。 VDD/VDDA域主要供PMU控制器、ADC、DAC等外设使用&#xff1b;1.2V域就是大部分外设都会使用的电源域…

ai大模型之争-生成音乐-豆包

豆包网页版&#xff1a;豆包 可以生成自定义音乐了 1&#xff0c;打开网页&#xff0c;登录 2&#xff0c;选择音乐生成 3&#xff0c;进行音乐配置 3.1&#xff0c;可以选择&#xff1a; 1&#xff0c;自己写歌词或者ai创造歌词&#xff1b; 2&#xff0c;可以选输入歌词…

xss漏洞复现

目录 第一关 第二关 第三关 第四关 第五关 第一关 要求&#xff1a; Pop an alert(1337) on sandbox.pwnfunction.com. No user interaction. 代码&#xff1a; <!-- Challenge --> <h2 id"spaghet"></h2> <script> spaghet.inn…

【数据结构与算法 | 图篇】Floyd-Warshall算法(多源最短路径算法)

1. 前言 Floyd-Warshall算法是一种在有向图或无向图中寻找所有顶点对之间的最短路径的动态规划算法。该算法可以处理带权重的边&#xff0c;并且能够正确处理负权重的边&#xff08;但不包括负权重循环&#xff09;&#xff0c;不过它不能处理包含负权重循环的情况&#xff0c…

IDEA 设置SVN项目管理忽略文件

忽略已经控制的文件 打开本地已经克隆下来的项目&#xff0c;并找到需要忽略控制的文件或文件夹 操作完成之后需要将当前的操作更新到SVN服务器。 直接在IDEA中提交修改&#xff08;快捷键CTRL K&#xff09;就可以 unverison: 取消版本控制 add to ignore list&#xff1…

C语言之文件操作上卷(二十一)(逆行人生-2024)

&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3; ✏️作者主页&#xff1a;枫霜剑客 &#x1f4cb; 系列专栏&#xff1a;C语言知识学习归纳总结&#xff08;逐梦篇专栏合集&#xff09; &#x1f332;上一篇: C语…

17 Menubutton 组件

17 Menubutton 组件 Tkinter 的 Menubutton 组件是一个特殊的按钮&#xff0c;当点击时会弹出一个菜单。这个菜单可以包含多个菜单项&#xff0c;允许用户从菜单中选择一个选项。Menubutton 通常用于创建带有下拉菜单的界面。以下是对 Menubutton 组件的详细说明和一个使用案例…

力控机器人torque-controlled robots

力控机器人&#xff08;Torque-Controlled Robots&#xff09;&#xff0c;也称为力矩控制机器人&#xff0c;是一种能够感知并实时控制施加在物体上力量的机器人系统。这类机器人通过集成力传感技术&#xff08;Force Sensing Technology&#xff09;和控制算法&#xff08;Co…

C++ | Leetcode C++题解之第343题整数拆分

题目&#xff1a; 题解&#xff1a; class Solution { public:int integerBreak(int n) {if (n < 3) {return n - 1;}int quotient n / 3;int remainder n % 3;if (remainder 0) {return (int)pow(3, quotient);} else if (remainder 1) {return (int)pow(3, quotient …

【CPP】继承语法详解与菱形继承

关于我&#xff1a; 睡觉待开机&#xff1a;个人主页 个人专栏: 《优选算法》《C语言》《CPP》 生活的理想&#xff0c;就是为了理想的生活! 作者留言 PDF版免费提供&#xff1a;倘若有需要&#xff0c;想拿我写的博客进行学习和交流&#xff0c;可以私信我将免费提供PDF版。…

iOS更新后在IPhone上恢复丢失的文本消息的4种方法

您是否在更新 iPhone 软件后丢失了重要的短信&#xff1f;丢失数据可能会令人沮丧&#xff0c;尤其是当它包含有价值的信息或感性信息时。幸运的是&#xff0c;有一些方法可以在iOS更新后恢复iPhone上丢失的短信。 在这篇博文中&#xff0c;我们将讨论可用于恢复丢失的短信的不…

【19. 删除链表的倒数第 N 个结点 中等】

题目&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;…

Vue学习 Day03 (hooks和路由)

自定义hooks 准备工作&#xff1a;首先导入axios的依赖 案例 首先写一个子组件&#xff0c;如下 <template> <h2>{{ sum }}</h2> <button click"addSum">点我sum1</button> <hr><img v-for"(dog,index) in dogs&qu…

Bugku-web-你必须让他停下来

打开环境&#xff0c;先分析出现的提示是让这个页面停下来 我们尝试关闭JS&#xff0c;发现确实停下来了-----》F12查看页面源代码但是flag还是没有出现&#xff0c;----》尝试刷新jpg随着刷新而变化&#xff0c;当刷新到10.jpg时flag出现 最后我尝试不关js刷新打开源代码刷新也…

展厅中控需要配套些什么设备

展厅中控系统需要配套的设备主要包括以下几个方面&#xff0c;以确保展厅内各种设备的高效管理和控制&#xff1a; 一、核心控制设备 中控主机&#xff1a; 功能&#xff1a;中控主机是展厅中控系统的核心&#xff0c;能够全面管理和控制展厅内的所有声光电设备。重要性&…

Jetpack 各种框架简介

Jetpack是Google推出的一套为Android开发提供极大便利的组件、工具和指导集&#xff0c;旨在帮助开发者快速构建高质量的应用&#xff0c;并遵循最佳实践。 Jetpack不仅是一个提高开发效率的工具集&#xff0c;还是Android开发的未来方向。它通过整合各种组件和工具&#xff0…

Easy SSSP(sssp)

目录 题目描述 输入 输出 样例输入 样例输出 提示 代码 今天的特邀网站&#xff1a; 和 题目描述 输入数据给出一个有 N 个节点&#xff0c;M 条边的带权有向图。要求你写一个程序&#xff0c;判断这个有向图中是否存在负权回路。如果从一个点沿着某条路径出发&#xff0c;又回…

【文献阅读】COUNTGD 模型结构

提出什么模块 解决什么问题 图、贡献&#xff0c;模型架构 图1 图1&#xff1a;COUNTGD能够同时使用视觉示例和文本提示来产生高度准确的对象计数&#xff08;a&#xff09;&#xff0c;但也无缝支持仅使用文本查询或仅使用视觉示例进行计数&#xff08;b&#xff09;。多模态视…

Jenkins入门以及安装

本文主要讲解&#xff0c;什么是Jenkins&#xff0c;Jenkins在Linux上如何安装。因为最近在公司&#xff0c;需要安装一套测试环境&#xff0c;便想着写了此篇文章。 什么是Jenkins Jenkins是一个开源的自动化部署工具&#xff0c;它能够持续地自动化构建、测试和部署软件项目…