RichText的换行问题,右边对不齐,是bug吗?来看代码

RichText的问题一直存在, 我们来分析下RichText的代码吧,

//文本元素的添加
void RichText::handleTextRenderer(const std::string& text, const std::string& fontName, float fontSize, const Color3B &color, GLubyte opacity)
{
    auto fileExist = FileUtils::getInstance()->isFileExist(fontName);
    Label* textRenderer = nullptr;
    if (fileExist)
    {
        textRenderer = Label::createWithTTF(text, fontName, fontSize);
    } 
    else
    {
        textRenderer = Label::createWithSystemFont(text, fontName, fontSize);
    }
    //取到Label控件的长度
    float textRendererWidth = textRenderer->getContentSize().width;
    _leftSpaceWidth -= textRendererWidth;//leftSpaceWidth richtext控件的长度
    if (_leftSpaceWidth < 0.0f)//说明一个文本元素比一行长,要换行了
    {
        float overstepPercent = (-_leftSpaceWidth) / textRendererWidth;//一行占总文本的长度百分比
        std::string curText = text;
        size_t stringLength = StringUtils::getCharacterCountInUTF8String(text);//文本的字个数
        int leftLength = stringLength * (1.0f - overstepPercent);//一行中占的字的个数,这里就是问题所在
        //The minimum cut length is 1, otherwise will cause the infinite loop.
        if (0 == leftLength) leftLength = 1;
        std::string leftWords = Helper::getSubStringOfUTF8String(curText,0,leftLength);
        std::string cutWords = Helper::getSubStringOfUTF8String(curText, leftLength, stringLength - leftLength);
        if (leftLength > 0)
        {
            Label* leftRenderer = nullptr;
            if (fileExist)
            {
                leftRenderer = Label::createWithTTF(Helper::getSubStringOfUTF8String(leftWords, 0, leftLength), fontName, fontSize);
            }
   int leftLength = stringLength * (1.0f - overstepPercent);//一行中占的字的个数,这里就是问题所在,这里的意思是  

(一行长度/文本框长度总长度)*文本总字数 = 一行里应该有几个字数

这个公式成立的条件是每个字占有的宽度一样,但实际中一个 英文,数字,符号,中文的宽度是不一样的,下面是测试代码,大家可以自己测试下看

     //////////////////测试富文本
    string fontName = "Helvetica";
    string strRight =  "这周六,一年一度的万dsafdsafd圣节又来啦dfadfsdfdsafqwrew原梓菲q23141234这”个“西方的“鬼节”已经变成一个霍布斯老太太城左影响力流行和受欢迎的节日之一。";

    
    ui::RichText *pRichText = ui::RichText::create();
    pRichText->ignoreContentAdaptWithSize(false);
    ui::RichElementText* re1 = ui::RichElementText::create(1, Color3B::WHITE, 255, strRight,fontName, 18.0f);
    pRichText->setContentSize(Size(600,300));
    pRichText->setAnchorPoint(Vec2(0, 0));
    pRichText->formatText();
    Size sizeText = pRichText->getContentSize();
    pRichText->setPosition(Vec2(-pRichText->getContentSize().width/2,0));
    pRichText->pushBackElement(re1);
    addChild(pRichText);

效果就是这样

如果写得不对请大家指出,按richtext的思路要准确换行要知道每个字符的宽度才行,我的做法是英文数字算0.5*fontsize ,但在有符号“,的情况尾部还是不可能对齐,大家有什么办法解决吗?