从零开始の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中的所有动作 ...
随机推荐
- lattice planner 规划详解
大家好,我是来自百度智能驾驶事业群的许珂诚.今天很高兴能给大家分享Apollo 3.0新发布的Lattice规划算法. Lattice算法隶属于规划模块.规划模块以预测模块.routing模块.高精地 ...
- Notepad++颜色配置
目前看着比较顺眼的notepad++配置,记录如下:
- Datamation Index
Datamation Index Understand how to handle big data and improve organizational agility to support ...
- 自然语言处理课程(二):Jieba分词的原理及实例操作
上节课,我们学习了自然语言处理课程(一):自然语言处理在网文改编市场的应用,了解了相关的基础理论.接下来,我们将要了解一些具体的.可操作的技术方法. 作为小说爱好者的你,是否有设想过通过一些计算机工具 ...
- SuperSocket根据条件获取 Session
如果你有一个自定义的属性 "CompanyId" 在你的 AppSession 类之中,如果你想要获取这个属性等于某值的 的所有 Session, 你可以使用 AppServer ...
- LRJ 3-7
#define _CRT_SECURE_NO_WARNINGS #include <cstdio> int main() { int T; int m, n; ][]; // 4 < ...
- 2016.1.22 扩充临时表空间解决ora-01652错误
今天运行一个复杂查询时报错ora-01652 无法通过128 扩展temp段, 网上说是临时表空间大小不够,运行了脚本调整临时表空间,问题解决 alter database tempfile '/ap ...
- Vue 组件中的data数据
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- urlencode()与urldecode()
urlencode()函数原理就是首先把中文字符转换为十六进制,然后在每个字符前面加一个标识符%. urldecode()函数与urlencode()函数原理相反,用于解码已编码的 URL 字符串,其 ...
- P1094 百钱白鸡
题目描述 公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买100只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱. 输入格式 无. 输出格式 输出所有 ...