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

3
我已经知道如何在iPhone应用程序中从这里加载自定义字体。我想问一下是否有一种方法可以通过代码实现这个功能?我的问题是我在应用程序中有一个资源文件夹,我有一个字体文件名,我们称之为“myfont.ttf”。
我想从代码中获取ttf文件并将其放入plist文件中,并且我还想知道fontWithName:size:方法的显示名称。有什么方法可以实现这个吗?
3个回答

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 中。

这个方法有效,它将字体应用到标签上了,但是没有注册成功。 - Durgaprasad
@pixelrevision CTFontManagerRegisterGraphicsFont是否会将字体永久注册到设备上? - vignesh kumar
CGFontRef font = CGFontCreateWithDataProvider(provider); 应用程序在这一行上永远挂起。(iOS 10.2) - dev gr
1
在 https://dev59.com/2GAf5IYBdhLWcg3wOQYL 找到了解决方案。 - dev gr

4

是的,你可以。但是你需要大量使用CoreText和/或CoreGraphics。

Zynga有一个很好的类可以帮助你做到这一点: https://github.com/zynga/FontLabel

示例项目展示了如何从捆绑包中加载.ttf文件而不使用.plist,并在应用程序中使用这些字体。

代码是有效的,是一个很好的起点。

编辑:之前的方法使用了CoreGraphics,这很好,但使用Core Text会更好。 我找到了一个有趣的答案来回答这个问题:如何使用Core Text从文件中加载字体(TTF)?

如果您没有使用CoreText框架的经验,请阅读Apple文档中的官方介绍


2

如果您正在下载TTF文件,则可以执行以下操作将自定义字体注册到iOS字体管理器中。此代码段还会处理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);
         }
     }

你可以检查布尔值和错误状态,以确认注册和注销的状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接