@

简述

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的更多相关文章

  1. 从零开始のcocos2dx生活(七)ParticleSystem

    CCParticleSystem是用来设置粒子效果的类 1.粒子分为两种模式:重力模式 和 半径模式 重力模式独占属性: gravity 重力方向,Vec2类型,可以分别指定不同方向的重力大小 spe ...

  2. 从零开始のcocos2dx生活(二)Node

    节点 Node 文章目录 节点 Node 前言 变量初始化 创建一个节点对象 获取节点依赖的计数器 获取节点的描述(获取节点的Tag) 节点的局部层顺序值(LocalZOrder) 设置节点的Loca ...

  3. 从零开始のcocos2dx生活(十)ScrollView

    目录 简介 基础变量 ScrollViewDelegate Direction _dragging _container _touchMoved _bounceable _touchLength 方法 ...

  4. 从零开始のcocos2dx生活(九)CCBReader

    NodeLoaderLibrary是用来存储节点加载器类型的类,通过registerDefaultNodeLoaders()可以注册所有默认类型的加载器 在CocosBuilder的使用手册中: 1. ...

  5. 从零开始のcocos2dx生活(八)ParticleSystemQuad

    https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/#_1 写的真的非常好-最近没时间拜读,只看 ...

  6. 从零开始のcocos2dx生活(六)EventDispatcher

    EventDispatcher可能是所有的里面比较不容易理解也不容易看的 我说自己的理解可能会误导到你们-[索了你们看不下去>< 我写了几乎所有的代码的注释,有的是废话跳过就好 主要的代码 ...

  7. 从零开始のcocos2dx生活(一)内存管理

    cocos中所有的对象都是继承自Ref基类,Ref的职责就是对对象进行引用计数管理 内存管理中最重要的是三个方法retain().release().autorelease() 在cocos中创建对象 ...

  8. 从零开始のcocos2dx生活(五)ActionEase

    文章目录 sineEaseIn sineEaseOut sineEaseInOut expoEaseIn expoEaseOut expoEaseInOut easeIn easeOut easeIn ...

  9. 从零开始のcocos2dx生活(四)ActionManager

    文章目录 初始化构造函数 析构函数 删除哈希元素 分配存放动作对象的空间 通过索引移除动作 暂停动作 恢复动作 暂停所有的动作 恢复所有的动作 添加动作 移除所有的动作 移除target中的所有动作 ...

随机推荐

  1. Android 使用SwipeActionAdapter开源库实现简单列表的左右滑动操作

    我们做listview左右滑动操作时,一般中情况下,都是像QQ那样,左滑弹出操作菜单(删除.编辑),然后选择菜单操作: 这样的效果不可谓不好,算是非常经典. 另外,有少数的APP,尤其是任务管理类的A ...

  2. Oracle包utl_inaddr

    作用:用于取得局域网或Internet环境中的主机名和IP地址. 1.utl_inaddr.get_host_address 环境中IP地址 如果查询失败,则提示系统错误 查询www.qq.com的I ...

  3. oracle函数 UPPER(c1)

    [功能]将字符串全部转为大写 [参数]c1,字符表达式 [返回]字符型 [示例] SQL> select upper('AaBbCcDd') upper from dual; UPPER --- ...

  4. es6 promise简析

    1.Promise的含义 所谓Promise,就是一个对象,用来传递异步操作的消息. Promise对象有以下两个特点: 对象的状态不受外界影响.Promise对象代表一个异步操作,有三种状态:Pen ...

  5. 即插即用,基于阿里云Ganos快速构建云上开源GIS方案

    对于轻量级GIS应用,选择具备时空能力的云上数据库再搭配开源GIS软件,能够快速构建稳定.廉价.实用的GIS解决方案.Ganos是阿里云自研时空基础设施(PaaS层)的核心引擎,该引擎整合了云上异构计 ...

  6. Java JDBC学习实战(三): 事务管理

    一. 数据库的事务特性 事务是一步或多步组成操作序列组成的逻辑执行单元,这个序列要么全部执行,要么则全部放弃执行. 事务的四个特性:原子性(Atomicity).一致性(Consistency).隔离 ...

  7. 洛谷P1595 信封问题 题解 错排问题

    作者:zifeiy 标签:排列组合,错排问题 题目链接:https://www.luogu.org/problem/P1595 题目描述:某人写了n封信和n个信封,如果所有的信都装错了信封.求所有信都 ...

  8. H3C HDLC协议特点

  9. H3C NAT Server

  10. 浅谈Python Django框架

    1.Django简介 Python下有多款不同的 Web 框架,Django是最有代表性的一种.许多成功的网站和APP都基于Django. Django是一个开源的Web应用框架,由Python写成. ...