屎前巨坑UIRichText该改改了

第一个是中英文混排。如下图,会出现有英文的那一行后面有留白的情况,

这是由于handleTextRenderer在计算位置/长度的时候,把中英文文字的宽度当成相等来计算了,这肯定是不科学的,还是赶紧改一改吧,我看了下代码,这个问题3.9还有。

第二个跟实际应用有关。先看一段源码,这是在formarRenderers函数中,_ignoreSize为false时的处理

float newContentSizeHeight = 0.0f;
float *maxHeights = new float;

// 计算实际内容的高度
for (size_t i=0; i<_elementRenders.size(); i++)
{
Vector<Node*>* row = (_elementRenders*);
float maxHeight = 0.0f;
for (ssize_t j=0; jsize(); j++)
{
Node* l = row->at(j);
maxHeight = MAX(l->getContentSize().height, maxHeight);
}
maxHeights* = maxHeight;
newContentSizeHeight += maxHeights*;
}

    // 起始y坐标,用设置好的contentSize高度作为起始高度
    float nextPosY = _customSize.height;

    for (size_t i=0; i<_elementRenders.size(); i++)
    {
        Vector<Node*>* row = (_elementRenders*);
        float nextPosX = 0.0f;
        nextPosY -= (maxHeights* + _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;
        }
    }

// 设置RichElement父节点的ContentSize设置为RichText的contentSize
_elementRenderersContainer->setContentSize(_contentSize);

乍一看没什么问题,指定一个区域用作RichText的显示,这样可以用作一些页面的图文展示,然而在实际应用中,我们可能事先并不清楚这些图文混排之后的高度(譬如聊天消息),而且我们需要得到混排之后的真正高度,这样才可以根据正确的从上到下排列消息顺序。
如果按照RichText的使用方式,在创建完之后就要设置ignoreContentAdaptWithSize(false),为了指定宽度还要设置contentsize大小,这个高度是我们想要知道的结果,但是现在却要在创建的时候传入作为计算的参数,一句话——不科学。

建议改成这样:
// 起始y坐标,用实际的高度作为起始坐标
float nextPosY = newContentSizeHeight ;

实际的contentsize:
_elementRenderersContainer->setContentSize(Size(newContentSizeWidth, newContentSizeHeight));

这样在计算中事实上并不关心设置的contentsize的高度,而是用图文的高度来作计算。最后把图文的高度设置给_elementRenderersContainer,以方便之后可以获取到正确的高度。

当然上面的只是在现在的基础上打了补丁,满足了一部分需求,说到底还是难用,作者根本没考虑过使用着的需求。最好是保留原有的设计(指定size,用于已知页面的展示),增加只指定宽度(横排)或高度(竖排)的选项。

第三就是设置锚点的问题了。源码是这样的

RichText::formarRenderers()的最后
_elementRenderersContainer->setPosition(_contentSize.width / 2.0f, _contentSize.height / 2.0f);

设置锚点
void RichText::setAnchorPoint(const Vec2 &pt)
{
Widget::setAnchorPoint(pt);
_elementRenderersContainer->setAnchorPoint(pt);
}

设置完锚点之后,在formarRenderers中为什么还用0.5来计算?坑爹啊

不知道说得对不对,但是希望可以重视UI控件的设计,这样cocos才能越做越好


:14:其实你都找到原因了,自己也能改改
我现在用的就是自己改的

改是可以改,不过想升级引擎怎么办呢,又要重新改一次,如果cocos能把这些问题处理好更好啦

富文本源码计算高度的时候有bug,细看一下能看出来。我重写了相关代码,顺便加了删除线和简单的标签处理,用c++11标准库重写了u16字符计算的部分,cocos的富文本完全是个大坑

能不能贴出来分享一下啊:11:

项目未结,暂时不能。。。

看着看着,整个人都斜了

应该再加上超链接

标记一下 防止入坑。