首先,你可能想通过getContentSize来获取。
可是不行!因为你必须先调用formatText进行渲染后,才可能拿到。
对于单行文本的情况,可算行得通了。
如果你处理的是多行文本, 一般如下使用:
self._richText:ignoreContentAdaptWithSize(false)
self._richText:setContentSize(cc.size(100,100))
你会发现getContentSize的返回就是你setContentSize的填入。此路不通。
上帝关闭一扇门的同时也为你打开一扇窗。
你发现还有一个方法getVirtualRendererSize。
可是quick引擎偷懒了。cpp到lua, 居然没有这个转换。
所以我们需要修改文件:lua_cocos2dx_ui_auto.cpp
打开后,找到代码:tolua_beginmodule(tolua_S,"RichText”);
也就是第19753行, 在其下面增加一行:tolua_function(tolua_S,“getVirtualRendererSize”,lua_cocos2dx_ui_RichText_getVirtualRendererSize);
添加完宏声明,我们继续添加实现函数,我选择在19367行后面添加以下代码:
int lua_cocos2dx_ui_RichText_getVirtualRendererSize(lua_State* tolua_S)
{
int argc = 0;
cocos2d::ui::RichText* cobj = nullptr;
bool ok = true;
#if COCOS2D_DEBUG >= 1
tolua_Error tolua_err;
#endif
#if COCOS2D_DEBUG >= 1
if (!tolua_isusertype(tolua_S,1,“ccui.RichText”,0,&tolua_err)) goto tolua_lerror;
#endif
cobj = (cocos2d::ui::RichText*)tolua_tousertype(tolua_S,1,0);
#if COCOS2D_DEBUG >= 1
if (!cobj)
{
tolua_error(tolua_S,“invalid ‘cobj’ in function ‘lua_cocos2dx_RichText_getVirtualRendererSize’”, nullptr);
return 0;
}
#endif
argc = lua_gettop(tolua_S)-1;
if (argc == 0)
{
if(!ok)
{
tolua_error(tolua_S,“invalid arguments in function ‘lua_cocos2dx_RichText_getVirtualRendererSize’”, nullptr);
return 0;
}
cocos2d::Size ret = cobj->getVirtualRendererSize();
size_to_luaval(tolua_S, ret);
return 1;
}
luaL_error(tolua_S, “%s has wrong number of arguments: %d, was expecting %d \n”, “cc.RichText:getVirtualRendererSize”,argc, 0);
return 0;
#if COCOS2D_DEBUG >= 1
tolua_lerror:
tolua_error(tolua_S,"#ferror in function ‘lua_cocos2dx_RichText_getVirtualRendererSize’.",&tolua_err);
#endif
return 0;
}
终于可以在lua里面调用getVirtualRendererSize了,可是问题没这么简单。
看进去cpp的代码:UIRichText.cpp
问题出现在第403行
_elementRenderersContainer->setContentSize(_contentSize);
这里就是计算控件渲染后的尺寸,而高度并没有更新。我们需要如下修改:
_elementRenderersContainer->setContentSize(Size(_contentSize.width, newContentSizeHeight));
然后修改第423行
把this->setContentSize(_customSize);注释,并加入
Size s = getVirtualRendererSize();
this->setContentSize(s);
其中newContentSizeHeight就是我们感兴趣的信息,这样就更新完毕。
不仅仅最新的quick-3.5有这个bug, 最新的cocos2dx3.6里面也有这个bug。
问题到此终于结束,多行文本通过getVirtualRendererSize获得高度正常。