最近在学习Cocos2d-x,学习CCScrollView的时候走了很多弯路,决定记录下来。

学习cocos2d-x的最大的困惑就是资料不是很齐全,网上有很多资料,但是版本差异大,其次深度低,讲解不够透彻,最后发现想更好的理解只能去看源码。后来发现想用好cocos2d-x必须要看懂源码,因为有不少坑等着你踩。

CCScrollView是用来做屏幕滚动的UI组件,一个简单的CCScrollView的实现是这样的

  

  chatArea是一个CCScrollView*的对象,container是一个CCNode*对象,CCSrollView需要设置一个View相当于一个窗口,一个Container作为容器,窗口在容器上滚动,用户可以看到不同的内容,一般container比view会大

  

  坑爹的地方来了,如图所示

  

  

  这三句话的设置顺序是不能变的!!我学习的时候没有在我找到的资料上看到这个规定,比如那个蓝本的高级开放教程的,红白的权威指南啊(真心名不副实)

  

  为什么顺序不能变,我们看源码就知道了,源码分析请移步http://blog.csdn.net/it_small_farmer/article/details/38301607,这位仁兄的博客

  

  简要说一下,在setContainer中设置了this->m_pContainer = pContainer,同时也设置了锚点为0,0,所以在外面你之前设置锚点是没用的,(尼玛我怎么知道你又重设了锚点啊!你告诉我一声好不),在setContentSize中,实质是this->getContainer()->setContentSize(size),所以一定要先setContainer后才能设置成功。而setContentOffset的实质是设置container的Position(哦 呵呵,所以你之前设置过Position会发现是无效的)。所以这三句话设置的顺序非常重要。

  这是第一个弯路,第二个弯路是滚动的设计,我做的是一个聊天消息滚动。那么聊天消息开始怎么显示?新消息来了后前面的消息如何偏移?我首先脑抽想到的方案是将container的顶部与CCScrollView的下面对齐,第一条聊天来了后加入container的顶部,然后设置setContentOffset让他往上偏移,写好后发现OK,第一条信息没问题,第二条也没问题,那么问题来了,就这么简单的完成了?显然cocos不会让我这么轻而易举的本垒打,所以当我点击或者拖动的时候,显示的内容瞬间弹飞了,到了顶部,怎么拉都特么拉不下来,我只能跑去看CCScrollView的touchMoved源码,发现在这里会调用setContentOffset也就是重新设置了container的位置,好吧我蠢萌了,你拖动一下就要动container的位置,但是每接受一条新的聊天信息又会设置一下位置,瞬间就草泥马不可控了有木有。

  于是我决定只在开始设置contentffset,container的左下角和scrollview的左下角对齐,每次新消息来的时候,计算出偏移,重新设置上一条消息的y坐标,运行后发现没有问题了。学习这个组件花了几天,希望以后有人遇到这个问题我的文章能够帮助到他们。PS:出书的人请有点良心!!!!

  

  

    

最新文章

  1. linux vps安装kloxo配置全部过程
  2. angular2开发01
  3. 解决Ue4C++使用UMG之类的模块时出现的拼写错误
  4. javascrit2.0完全参考手册(第二版) 第2章第4节 基本的数据类型
  5. VS-Visual Studio-IIS Express 支持局域网访问
  6. Cordova or Xamarin 用.net开发IOS和Android程序
  7. jQuery中 判断事件
  8. uDig 简介
  9. sql给数据库加锁问题
  10. centos6.4下安装freetds使php支持mssql
  11. memcached的安装
  12. 运行gpg --gen-key生成key时出现卡住的问题
  13. Alpha第二天
  14. EXISTS的使用详解
  15. JAVA之旅(二十七)——字节流的缓冲区,拷贝mp3,自定义字节流缓冲区,读取键盘录入,转换流InputStreamReader,写入转换流,流操作的规律
  16. Fescar Quick Start
  17. ddos,cc 攻击特征研究
  18. isprime_判断质数
  19. WPF Slider滑动条的颜色修改
  20. 诡异的Linux磁盘空间被占用问题,根目录满了,df和du占用不一样【转】

热门文章

  1. ios Label TextFile 文本来回滚动 包括好用的三方
  2. 网络编程 socket编程 - Asyncsocke
  3. Windows2008操作系统 IIS7 IIS7.5 进程池经常死最终解决方案
  4. For input string: "null"
  5. 《DSP using MATLAB》示例Example 8.7
  6. Flask第六篇——项目配置文件
  7. VMware harbor && minio 搭建企业docker私有镜像以及需要注意的问题
  8. hadoop 之Hadoop生态系统
  9. 【转载】最短路径—Dijkstra算法和Floyd算法
  10. 轻量级封装DbUtils&Mybatis之二Dbutils