Quick-3.5获取RichText高度

首先,你可能想通过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获得高度正常。

getVirtualRendererSize不用去转换的吧?父类Widget有转,直接调用即可的啊…

第403行的
_elementRenderersContainer->setContentSize(Size(_contentSize.width, newContentSizeHeight));
改动过后是达到了要求了
只是我刚创建完RichText后立即调用getVirtualRendererSize,取出来的size是(0,0)
一开始我还以为改动无效,在界面加了个按钮,按钮的回调离 重新打印getVirtualRendererSize,这回才正确了。这是为何?初始化过后立即打印是无效的

必须先调用formatText进行渲染后,才可能拿到。