iOS中的动态自定义字体加载器

时间:2012-04-25 08:57:46

标签: iphone objective-c ios uifont

我已经知道如何从here向iPhone App中的项目加载自定义字体 我想询问是否有办法从代码中执行此操作?我的问题是我的应用程序中有一个资源文件夹,我有一个字体文件名,我们称之为“ myfont.ttf ”。

我想获取一个ttf文件并将其放入plist文件 from code ,而且我还想了解 fontWithName:size:方法的显示名称。有办法实现这个目标吗?

3 个答案:

答案 0 :(得分:14)

这是一个较旧的问题,但无论如何,如果有其他人遇到这个问题,这是一种方法。


+ (void)loadFontAtPath:(NSString*)path{
    NSData *data = [[NSFileManager defaultManager] contentsAtPath:path];
    if(data == nil){
        NSLog(@"Failed to load font. Data at path is null");
        return;
    }
    CFErrorRef error;
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);
    CGFontRef font = CGFontCreateWithDataProvider(provider);
    if(!CTFontManagerRegisterGraphicsFont(font, &error)){
        CFStringRef errorDescription = CFErrorCopyDescription(error);
        NSLog(@"Failed to load font: %@", errorDescription);
        CFRelease(errorDescription);
    }
    CFRelease(font);
    CFRelease(provider);
}

这将在运行时指定的路径加载字体,然后您可以像平常一样使用它而不将其添加到plist。

答案 1 :(得分:4)

是的,你可以。但是你必须使用CoreText和/或CoreGraphics进行大量工作。

来自Zynga的一个很好的课程可以帮助你做到这一点: https://github.com/zynga/FontLabel

示例项目显示如何在不使用.plist的情况下从包中加载.ttf文件,并在应用程序中使用这些字体。

代码有效,从一开始就是一个好点。

编辑:之前的方法使用CoreGraphics,这很好,但使用Core Text要好得多。 我找到了一个有趣的答案:How can you load a font (TTF) from a file using Core Text?

如果您没有使用CoreText框架的经验,请阅读official introduction inside the Apple documentation

答案 2 :(得分:2)

如果您正在下载TTF文件,那么您可以通过iOS Font Manager注册自定义字体,这段代码也可以处理TTF文件更新(字体更新):

    +(void)registerFontsAtPath:(NSString *)ttfFilePath
    {
        NSFileManager * fileManager = [NSFileManager defaultManager];

        if ([fileManager fileExistsAtPath:ttfFilePath] == YES)
        {
            [UIFont familyNames];//This is here for a bug where font registration API hangs for forever.

            //In case of TTF file update : Fonts are already registered, first de-register them from Font Manager
            CFErrorRef cfDe_RegisterError;
           bool fontsDeregistered = CTFontManagerUnregisterFontsForURL((__bridge CFURLRef)[NSURL fileURLWithPath:ttfFilePath], kCTFontManagerScopeNone, &cfDe_RegisterError);


            //finally register the fonts with Font Manager,
            CFErrorRef cfRegisterError;
            bool fontsRegistered= CTFontManagerRegisterFontsForURL((__bridge CFURLRef)[NSURL fileURLWithPath:ttfFilePath], kCTFontManagerScopeNone, &cfRegisterError);
         }
     }

您可以检查布尔和错误的注册和取消注册状态。