从零开始の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中的所有动作 ...
随机推荐
- @codeforces - 141E@ Clearing Up
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 N 个点 M 条边的图,每条为黑色或者白色. 现在让你 ...
- auto uninstaller密钥激活码破解注册机ver 8.8.58
auto uninstaller密钥破解注册机ver 8.8.58 楼主分享几个auto uninstaller密钥破解注册机,可以用于auto uninstaller 8.8.58 .因为每个版本的 ...
- oracle函数 sqrt(x)
[功能]返回x的平方根 [参数]x数字型表达式 [返回]数字 [示例] select sqrt(64),sqrt(10) from dual; 返回:8 , 3.16227766
- oracle函数 SUBSTR(c1,n1[,n2])
[功能]取子字符串 [说明]多字节符(汉字.全角符等),按1个字符计算 [参数]在字符表达式c1里,从n1开始取n2个字符;若不指定n2,则从第y个字符直到结束的字串. [返回]字符型 [示例] SQ ...
- phpstudy一直使用php5.6版本一直“”“报错应用程序无法正常启动0xc000007b”,亲测可行
http://www.php.cn/xiazai/gongju/1351 vc9和vc11-vc14运行库 2018-01-26 来源/作者:php中文网 «» 下载次数:7808 工具简介: php ...
- Android Studio(六):Android Studio添加注释模板
Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...
- CSS定位方式有哪些?position属性的值有哪些?他们之间的区别是什么?
在CSS中关于定位的内容是:position:relative | absolute | static | fixed • static 自动定位,自动定位就是元素在页 面普通文档流中由HTML自动定 ...
- uni-app学习记录04-轮播图和滑屏图片
<template> <view> <!-- 轮播图视图 swiper-item是每页的元素 --> <swiper :indicator-dots=&quo ...
- Python--day46--MySQL自定义函数
1,mysql自定义函数(mysql函数会降低查找速度,使用 了函数的行和列不能再用索引查找了,这样对性能要求高的需求就不能这样写) 函数调用 select f(参数1,参数2): 对函数进行调用:
- JPA一对多循环引用的解决&&JackSon无限递归问题
说是解决,其实不是很完美的解决的,写出来只是想记录一下这个问题或者看一下有没有哪位仁兄会的,能否知道一二. 下面说说出现问题: 问题是这样的,当我查询一个一对多的实体的时候,工具直接就爆了,差不多我就 ...