[寒江孤叶丶的Cocos2d-x之旅_21]3.x RichText自动适应高度,formarRenderers 自动更改高度 疑似BUG修复
来源:互联网 发布:浙江网络发票查询系统 编辑:程序博客网 时间:2024/05/22 08:38
原创文章,欢迎转载,转载请注明:文章来自[寒江孤叶丶的CrossApp之旅系列]
博客地址:http://blog.csdn.net/qq446569365
RichText 是Cocos GUI功能中的一个控件,主要用于图文混编。称之为“富文本”。然后笔者在使用其进行开发的过程中发现他居然不回自动更改控件的高度。下边空出一大块范围,由于我是用其开发聊天系统,下边空出一行实在是无法忍受的,所以开始对源代码动刀子,尝试添加个功能。在添加过程中发现,触控团队应该是有让他自动适应高度的功能,但是不知道为啥却没有实现(目测是在代码里少打了一行……)笔者修复了一下,(菜鸟级修复,大神请别喷,如果有更好的方案,请务必回复告知,跪谢!)。
修复方法很简单,找到ui/UIRichText.cpp文件中的formarRenderers方法(OMG,触控的各位大牛,咱不至于把 t 按成 r 吧……),
添加两行行代码:
_customSize.height=newContentSizeHeight;
_elementRenderersContainer->setContentSize(_size);
并修改一行:
_elementRenderersContainer->setPosition(0,0);
即可!如果本篇博客就这么完了,我相信读者一定要打死我了!所以,附上代码段……
3.0版本代码段:
void RichText::formarRenderers(){ if (_ignoreSize) { float newContentSizeWidth = 0.0f; float newContentSizeHeight = 0.0f; Vector<Node*>* row = (_elementRenders[0]); float nextPosX = 0.0f; for (ssize_t j=0; j<row->size(); j++) { Node* l = row->at(j); l->setAnchorPoint(Point::ZERO); l->setPosition(Point(nextPosX, 0.0f)); _elementRenderersContainer->addChild(l, 1, (int)j); Size iSize = l->getContentSize(); newContentSizeWidth += iSize.width; newContentSizeHeight = MAX(newContentSizeHeight, iSize.height); nextPosX += iSize.width; } _elementRenderersContainer->setContentSize(Size(newContentSizeWidth, newContentSizeHeight)); } else { float newContentSizeHeight = 0.0f; float *maxHeights = new float[_elementRenders.size()]; for (size_t i=0; i<_elementRenders.size(); i++) { Vector<Node*>* row = (_elementRenders[i]); float maxHeight = 0.0f; for (ssize_t j=0; j<row->size(); j++) { Node* l = row->at(j); maxHeight = MAX(l->getContentSize().height, maxHeight); } maxHeights[i] = maxHeight; newContentSizeHeight += maxHeights[i]; } _customSize.height=newContentSizeHeight;//------------------添加的第一行------------------ float nextPosY = _customSize.height; for (size_t i=0; i<_elementRenders.size(); i++) { Vector<Node*>* row = (_elementRenders[i]); float nextPosX = 0.0f; nextPosY -= (maxHeights[i] + _verticalSpace); for (ssize_t j=0; j<row->size(); j++) { Node* l = row->at(j); l->setAnchorPoint(Point::ZERO); l->setPosition(Point(nextPosX, nextPosY)); _elementRenderersContainer->addChild(l, 1, (int)(i*10 + j)); nextPosX += l->getContentSize().width; } } _elementRenderersContainer->setContentSize(_size); delete [] maxHeights; } size_t length = _elementRenders.size(); for (size_t i = 0; i<length; i++){ Vector<Node*>* l = _elementRenders[i]; l->clear(); delete l;} _elementRenders.clear(); if (_ignoreSize) { Size s = getVirtualRendererSize(); _size = s; } else { _size = _customSize; } updateContentSizeWithTextureSize(_size); _elementRenderersContainer->setContentSize(_size);//------------------添加的第二行------------------ _elementRenderersContainer->setPosition(0, 0);//------------------修改这行------------------ //最后这行原来是 _elementRenderersContainer->setPosition(_contentSize.width / 2.0f, _contentSize.height / 2.0f);}
3.3版本从代码上看好像也存在这个问题,但是我没有实际运行测试过是否有这个问题,懒得运行了。各位如果3.3遇到的话,也可以这么修复,只不过3.3版本有一些变量名的变化而已。
3.3版本代码:
void RichText::formarRenderers(){ if (_ignoreSize) { float newContentSizeWidth = 0.0f; float newContentSizeHeight = 0.0f; Vector<Node*>* row = (_elementRenders[0]); float nextPosX = 0.0f; for (ssize_t j=0; j<row->size(); j++) { Node* l = row->at(j); l->setAnchorPoint(Vec2::ZERO); l->setPosition(nextPosX, 0.0f); _elementRenderersContainer->addChild(l, 1); Size iSize = l->getContentSize(); newContentSizeWidth += iSize.width; newContentSizeHeight = MAX(newContentSizeHeight, iSize.height); nextPosX += iSize.width; } _elementRenderersContainer->setContentSize(Size(newContentSizeWidth, newContentSizeHeight)); } else { float newContentSizeHeight = 0.0f; float *maxHeights = new float[_elementRenders.size()]; for (size_t i=0; i<_elementRenders.size(); i++) { Vector<Node*>* row = (_elementRenders[i]); float maxHeight = 0.0f; for (ssize_t j=0; j<row->size(); j++) { Node* l = row->at(j); maxHeight = MAX(l->getContentSize().height, maxHeight); } maxHeights[i] = maxHeight; newContentSizeHeight += maxHeights[i]; } this->_customSize.height=newContentSizeHeight;//------------------添加的第一行------------------ float nextPosY = _customSize.height; for (size_t i=0; i<_elementRenders.size(); i++) { Vector<Node*>* row = (_elementRenders[i]); float nextPosX = 0.0f; nextPosY -= (maxHeights[i] + _verticalSpace); for (ssize_t j=0; j<row->size(); j++) { Node* l = row->at(j); l->setAnchorPoint(Vec2::ZERO); l->setPosition(nextPosX, nextPosY); _elementRenderersContainer->addChild(l, 1); nextPosX += l->getContentSize().width; } } _elementRenderersContainer->setContentSize(_contentSize); delete [] maxHeights; } size_t length = _elementRenders.size(); for (size_t i = 0; i<length; i++){ Vector<Node*>* l = _elementRenders[i]; l->clear(); delete l;} _elementRenders.clear(); if (_ignoreSize) { Size s = getVirtualRendererSize(); this->setContentSize(s); } else { this->setContentSize(_customSize); } updateContentSizeWithTextureSize(_contentSize); _elementRenderersContainer->setContentSize(_contentSize);//------------------添加的第二行------------------ _elementRenderersContainer->setPosition(0, 0);//------------------修改这行------------------ //最后这行原来是 _elementRenderersContainer->setPosition(_contentSize.width / 2.0f, _contentSize.height / 2.0f);}
改完之后保存编译即可!
2 0
- [寒江孤叶丶的Cocos2d-x之旅_21]3.x RichText自动适应高度,formarRenderers 自动更改高度 疑似BUG修复
- cocos2d-x RichText 真实高度
- [寒江孤叶丶的Cocos2d-x之旅_06]一句话教你Cocos2d-x如何自动适应屏幕大小
- 网页的高度自动适应
- 自动适应高度的TextArea
- iframe高度自动适应
- frame高度自动适应
- iframe自动适应高度
- iframe 高度自动适应
- Iframe自动适应高度
- iframe高度自动适应
- IFRAME 自动适应高度
- Iframe自动适应高度
- iframe自动适应高度
- iframe自动适应高度
- iframe 自动适应高度
- iframe 自动适应高度
- iframe高度自动适应
- android 画图之setXfermode
- ftp命令大全
- 2014 一网络公司 在线 面试题目 爬山问题:打印出从A点到B点的距离
- sventon具有管理权限
- Spring+Quartz定时任务示例2
- [寒江孤叶丶的Cocos2d-x之旅_21]3.x RichText自动适应高度,formarRenderers 自动更改高度 疑似BUG修复
- Android NDK编译之环境Cygwin 独立安装 make 离线包
- 【LeetCode】Partition List 解题报告
- android控件开发之RatingBar
- matlab 在使用mex编译的问题
- 一个简单的网络编程实例
- [leetcode]Single Number II —— 水题。换个角度思考
- SSI框架整合-1
- iOS: FFmpeg编译和使用问题总结