我已经知道如何从here向iPhone App中的项目加载自定义字体 我想询问是否有办法从代码中执行此操作?我的问题是我的应用程序中有一个资源文件夹,我有一个字体文件名,我们称之为“ myfont.ttf ”。
我想获取一个ttf文件并将其放入plist文件 from code ,而且我还想了解 fontWithName:size:方法的显示名称。有办法实现这个目标吗?
答案 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);
}
}
您可以检查布尔和错误的注册和取消注册状态。