第一个是中英文混排。如下图,会出现有英文的那一行后面有留白的情况, 
这是由于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才能越做越好
其实你都找到原因了,自己也能改改