从零开始のcocos2dx生活(十一)TableView
目录
@
简述
TableView主要是为了减少内存的使用,其实现效果和scrollView类似,会将一个个的图像保存为多个cell,在cell不显示的时候,将其会受到缓存中,当滑动到可显示的时候,再从缓存中读取出来。
主要变量
**_indices** 存储可见范围内cell的索引
**_vordering** 从上到下或者从下到上
**_isUsedCellsDirty** 排序脏标记
**_cellsUsed** 存储正在使用的cell
**_cellsFreed** 存储不显示的cell
主要方法
setVerticalFillOrder
设置cell的排列方式
- 对cell的排列方式重新设置
- 如果cellsUsed不是空的就调用reloadData
reloadData
重新加载数据来刷新视图
- 重置位置
- 遍历cellsUsed中的cell
- 调用回收cell的自定义回调函数
- 将cell放入缓存容器中
- cell的位置索引设为-1
- 从当前容器中移除当前遍历到的cell
- 清理视图内的cell索引
- 清理存储可视范围内cell的容器
- 刷新cell的位置
- 刷新容器的尺寸
- 调用拖动的回调
cellAtIndex
通过idx找到可视范围内的cell
- 遍历找到idx相同的cell并返回
updateCellAtIndex
更新指定idx的cell的信息,在scrollViewDidScroll找到未添加的cell时调用
- 获取视图中的cell个数
- 获取idx对应的cell
- 如果现在的视图中有这个idx的cell,就加入到缓存中并从当前的视图中移除,索引也移除
- 然后从缓存中读入第一个cell,调用setIndexForCell来设置锚点、位置、idx
- 如果cell不在当前的容器中,就加入并且加到cellsUsed和indices中,并且设置需要刷新顺序的脏标记
insertCellAtIndex
在idx出插入新的cell
- 判断idx是否无效
- 获取当前的cell个数
- 尝试获取idx位置上的cell
- 如果有cell,先获取新的cell
- 将原先的和后面的cell一起往后移动一位
- 然后将缓存中的第一个cell插入idx的位置,并设置属性
- 更新更新cell的位置和容器的大小
removeCellAtIndex
移除指定index的cell
- 先获取cell个数,如果是非法值就直接返回
- 从正在使用的cell容器中获取index对应的cell
调用_moveCellOutOfSight方法
- 加入到缓存容器中,从正在使用的cell容器中移除,设置重排序脏标记,从索引中删除,重置cell
- 从父节点容器中删除这个cell
回到移除方法
- 又进行了一次索引移除的操作,这里我觉得是多余的操作,因为在上面的_move方法中已经做了移除索引的操作了
- 刷新cell的位置
- 遍历正在使用的cell容器,将所有的Idx-1
dequeueCell
获取缓存中第一个cell,并从缓存中移除
获取、retain、erase、autorelease
_addCellIfNecessary
将cell添加到当前容器
- 如果cell的父节点不是当前的容器就添加到现在的容器中
- 将cell加入到cellUsed中
- 将cell的idx加入到indices中
- 添加排序脏标记
_updateContentSize
- 获取cell的个数
- 如果cell的个数大于0,判断滑动的方向,设置不同的大小
- 如果现在设置的滑动方向和初始的滑动方向不一样,重新设置容器的偏移和oldDirection
_offsetFromIndex
调用__offsetFromIndex
- 根据滑动方向对容器的偏移重新设置
回到_offsetFromIndex
- 获取cell的尺寸
- 如果排列顺序是从上到下就对上面最后一个位置留出一个空间位置用来下一次添加
_indexFromOffset
- 获取最大的index
- 如果排列顺序是从上到下就对上面最后一个位置留出一个空间位置用来下一次添加
__indexFromOffset
- 获取cell的个数并减1作为索引
- 对不同拖动方向的设置要查找的offset
- 如果high >= low,获取中间的index,获取index两边的cell并从两边向中间遍历
- 符合if的条件了就返回找到的index
回到函数
- 如果index不等于-1
- index只会是等于0或者大于0的,获取它
- 如果是超限了,就设置成-1
- 最后返回得到的index
scrollViewDidScroll
- 获取已显示的cell个数
- 判断是否有脏标记,有就取消标记并排序
- 根据不同的排列方式设置偏移量
- 获取第一个和最后一个可显示的cell的index,下面的代码会用到,如果第一个或者最后一个的index是-1,表示是占位空间,则将idx设为-1
- 测试代码下面的两个if用来将不在显示范围内的cell移入缓存中
- 最后调用代理方法来调用scrollViewDidScroll来使用回调方法
触摸各阶段的回调方法
onTouchEnded
onTouchBegan
onTouchMoved
onTouchCancelled
都是先调用继承的scrollView中的触摸回调,然后再执行TableView中的逻辑,用来处理偏移和内存的问题
从零开始のcocos2dx生活(十一)TableView的更多相关文章
- 从零开始のcocos2dx生活(七)ParticleSystem
CCParticleSystem是用来设置粒子效果的类 1.粒子分为两种模式:重力模式 和 半径模式 重力模式独占属性: gravity 重力方向,Vec2类型,可以分别指定不同方向的重力大小 spe ...
- 从零开始のcocos2dx生活(二)Node
节点 Node 文章目录 节点 Node 前言 变量初始化 创建一个节点对象 获取节点依赖的计数器 获取节点的描述(获取节点的Tag) 节点的局部层顺序值(LocalZOrder) 设置节点的Loca ...
- 从零开始のcocos2dx生活(十)ScrollView
目录 简介 基础变量 ScrollViewDelegate Direction _dragging _container _touchMoved _bounceable _touchLength 方法 ...
- 从零开始のcocos2dx生活(九)CCBReader
NodeLoaderLibrary是用来存储节点加载器类型的类,通过registerDefaultNodeLoaders()可以注册所有默认类型的加载器 在CocosBuilder的使用手册中: 1. ...
- 从零开始のcocos2dx生活(八)ParticleSystemQuad
https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/#_1 写的真的非常好-最近没时间拜读,只看 ...
- 从零开始のcocos2dx生活(六)EventDispatcher
EventDispatcher可能是所有的里面比较不容易理解也不容易看的 我说自己的理解可能会误导到你们-[索了你们看不下去>< 我写了几乎所有的代码的注释,有的是废话跳过就好 主要的代码 ...
- 从零开始のcocos2dx生活(一)内存管理
cocos中所有的对象都是继承自Ref基类,Ref的职责就是对对象进行引用计数管理 内存管理中最重要的是三个方法retain().release().autorelease() 在cocos中创建对象 ...
- 从零开始のcocos2dx生活(五)ActionEase
文章目录 sineEaseIn sineEaseOut sineEaseInOut expoEaseIn expoEaseOut expoEaseInOut easeIn easeOut easeIn ...
- 从零开始のcocos2dx生活(四)ActionManager
文章目录 初始化构造函数 析构函数 删除哈希元素 分配存放动作对象的空间 通过索引移除动作 暂停动作 恢复动作 暂停所有的动作 恢复所有的动作 添加动作 移除所有的动作 移除target中的所有动作 ...
随机推荐
- qt 自定义窗口绘制正弦曲线
circlewidget.h #ifndef CIRCLAWIDGET_H #define CIRCLAWIDGET_H #include <QFrame> #include<QVe ...
- linux之docker
简介 Docker是一个开源的应用容器引擎,基于go语言,遵循从Apache2.0协议开源 Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植的容器中,然后发布到任何流行的linux ...
- 【学生研究课题】CSDN博客数据获取、分析、分享
题记 这次<对象程序设计>课程设计,一共给定了8个选题(下载WORD版.PDF版),以及自由选题的机会.从大家初步选题结果来看(图1).绝大部分同学选择了"图形用户界面的 ...
- 14海量日志提取出现次数最多的IP
问题描述:现有某网站海量日志数据,提取出某日访问该网站次数最多的那个IP. 分析:IP地址是32位的二进制数,所以共有N=2^32=4G个不同的IP地址, 如果将每个IP地址看做是数组的索引的话,那么 ...
- oracle函数 round(x[,y])
[功能]返回四舍五入后的值 [参数]x,y,数字型表达式,如果y不为整数则截取y整数部分,如果y>0则四舍五入为y位小数,如果y小于0则四舍五入到小数点向左第y位. [返回]数字 [示例] se ...
- @NOI模拟2017.07.02 - T1@ Attack
目录 @description@ @solution@ @accepted code@ @details@ @description@ 『新的风暴已经出现,怎么能够停滞不前』--你决定去攻击小怪兽的巢 ...
- setTimeout 传参
一般setTimeout中的参数为 setTimeout(f,time)但是如果我想要给f函数传入一个参数怎么办 setTimeout(f(arguments),time) 如果我这样写的话,那么ti ...
- tp5 字段验证表中是否唯一
namespace app\ps\validate; /** * 客户分类验证器 */ class CustomerCategory extends PsBase { // 验证规则 protecte ...
- Springboot 自定义多个404页面
在Springboot中,可以通过修改配置.或者在static文件夹下添加error文件夹引入个性化的404模版.但是如果需要针对不同url地址规则,返回不同样式的404页面,则难以实现了.针对这个问 ...
- js(一) 三大事件 实现注册验证
ps:小声比比,为什么一周多没更,因为js真的好难啊. 上一周做了一整周的jsp+sevlet+mysql做了一个MVC模式的最基本的新闻系统源码会有空搞出来的 好累 好多的. 三大事件 (鼠标事件. ...