美文网首页
cocos2dx RichText bug

cocos2dx RichText bug

作者: 许彦峰 | 来源:发表于2022-08-02 16:30 被阅读0次


    解决办法:

    1. font空tag自动删除
    2. engine支持空font标签,空属性的font标签也需要push

    这个bug应该在4.x中同样存在

    如果删除empty的判断,是解决了空tag的问题,但是又产生了其他问题
    渲染出来是黄色的

    <font color="#ffff00"><br/></font><font>white</font>
    

    本质上还是无法正确区分标签空属性非字体属性标签导致的

    MyXMLVisitor::setTagDescription("br", false, [](const ValueMap& /*tagAttrValueMap*/) {
        RichElementNewLine* richElement = RichElementNewLine::create(0, Color3B::WHITE, 255);
        return make_pair(ValueMap(), richElement);
    });
    

    std::pair主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型。
    这里的make_pair第一个参数,预期返回nullptr会好点,因为强数据类型的原因,无法返回nullptr

    typedef std::unordered_map<std::string, Value> ValueMap; // 无序列表
    typedef std::function<std::pair<ValueMap, RichElement*>(const ValueMap& tagAttrValueMap)> VisitEnterHandler;
    void setTagDescription(const std::string& tag, bool isFontElement, RichText::VisitEnterHandler handleVisitEnter);
    
    void MyXMLVisitor::startElement(void* /*ctx*/, const char* elementName, const char** atts){
        auto result = tagBehavior.handleVisitEnter(tagAttrValueMap);
        ValueMap& attrValueMap = result.first;
        RichElement* richElement = result.second;
    }
    

    我们发现返回ValueMap()的其实都不是fontElement,正好和setTagDescription的第二个参数呼应,其实也是和endElement逻辑是对应的

    void MyXMLVisitor::endElement(void* /*ctx*/, const char* elementName)
    {
        auto it = _tagTables.find(elementName);
        if (it != _tagTables.end()) {
            auto tagBehavior = it->second;
            if (tagBehavior.isFontElement) {
                popBackFontElement();
            }
        }
    }
    

    具体的修复pr: https://github.com/cocos2d/cocos2d-x/pull/20743

    相关文章

      网友评论

          本文标题:cocos2dx RichText bug

          本文链接:https://www.haomeiwen.com/subject/knrjwrtx.html