当前位置:   article > 正文

cocos creater ios端 字库不生效_ios ctfontmanagerunregistergraphicsfont 没有立即生效

ios ctfontmanagerunregistergraphicsfont 没有立即生效

问题描述:字库 在ios端 不生效 oc 报错信息 = NULL

需求: ios端除了cocos相关的操作 还需要原生页面的支持 ,但是修改完项目 字库在ios端 不生效

解决方案:

修改jsb_platform_apple.mm文件

static bool JSB_loadFont(se::State& s)
{
    const auto& args = s.args();
    size_t argc = args.size();
    CC_UNUSED bool ok = true;
    if (argc >= 1) {
        s.rval().setNull();

        std::string originalFamilyName;
        ok &= seval_to_std_string(args[0], &originalFamilyName);
        SE_PRECONDITION2(ok, false, "JSB_loadFont : Error processing argument: originalFamilyName");

        std::string source;
        ok &= seval_to_std_string(args[1], &source);
        SE_PRECONDITION2(ok, false, "JSB_loadFont : Error processing argument: source");

        std::string fontFilePath;
        std::regex re("url\\(\\s*'\\s*(.*?)\\s*'\\s*\\)");
        std::match_results<std::string::const_iterator> results;
        if (std::regex_search(source.cbegin(), source.cend(), results, re))
        {
            fontFilePath = results[1].str();
        }

        fontFilePath = FileUtils::getInstance()->fullPathForFilename(fontFilePath);
        if (fontFilePath.empty())
        {
            SE_LOGE("Font (%s) doesn't exist!", fontFilePath.c_str());
            return true;
        }

        NSURL* url = [NSURL fileURLWithPath: [NSString stringWithUTF8String:fontFilePath.c_str()]];
        NSData* dynamicFontData = [NSData dataWithContentsOfURL:url];
        if (!dynamicFontData)
        {
            SE_LOGE("load font (%s) failed!", source.c_str());
            return true;
        }

        const auto& familyNamesBeforeRegister = getAvailableFontFamilyNames();

        bool succeed = true;
        CFErrorRef error;
        CGDataProviderRef providerRef = CGDataProviderCreateWithCFData((CFDataRef)dynamicFontData);
        CGFontRef font = CGFontCreateWithDataProvider(providerRef);
        if (!CTFontManagerRegisterGraphicsFont(font, &error))
        {

                CFStringRef errorDescription = CFErrorCopyDescription(error);
            	
            	// 捕获报错信息代码修改.新代码可以捕获到报错信息.旧代码捕获不到
                CFIndex length = CFStringGetLength(errorDescription);
                CFIndex maxSize =
                CFStringGetMaximumSizeForEncoding(length, kCFStringEncodingUTF8) + 1;
                char *buffer = (char *)malloc(maxSize);
                if (CFStringGetCString(errorDescription, buffer, maxSize,
                                       kCFStringEncodingUTF8)) {
                    SE_LOGE("Failed to load font: %s", buffer);
                }
                // 原始代码注释. 捕获不到报错信息
//                const char* cErrorStr = CFStringGetCStringPtr(errorDescription, kCFStringEncodingUTF8);
//                SE_LOGE("Failed to load font: %s", cErrorStr);


                CFRelease(errorDescription);
                // 由于报错信息是105 重复注册 .表示 现在已经有字库 强制 success
                succeed = true;

        }
        
        succeed = true;
        if (succeed)
        {
            const auto& familyNamesAfterRegister = getAvailableFontFamilyNames();
            std::string familyName = getFontFamilyByCompareAvailableFontFamilyNames(familyNamesBeforeRegister, familyNamesAfterRegister);
			
			// 强制引用项目中的字库 名字如下  然后 就能走 字库的正常逻辑
            familyName = "FZCuYuan-M03S";
            if (!familyName.empty())
            {
                _fontFamilyNameMap.emplace(originalFamilyName, familyName);
                s.rval().setString(familyName);
            }
        }

        CFRelease(font);
        CFRelease(providerRef);
        return true;
    }

    SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1);
    return false;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/318875
推荐阅读
相关标签
  

闽ICP备14008679号