如何配置自定义字体
要使用自定义字体(iOS 中不包含该字体),您必须编辑您的 <appname>-Info.plist 文件并创建一个新的 UIAppFonts 类型为数组的键,其中数组的每个元素都是一个带有您的名称的字符串字体文件。示例:VAGRoundedStd-Light.ttf。您还必须将文件添加到您的项目中。
注意:当您输入UIAppFonts 并回车时,键会转换为“应用程序提供的字体”。
但是,当您在 Interface Builder(或 UIFont)中使用字体时,您不会使用字体的文件名,而是使用在应用程序中打开字体时出现的名称Font Book 您的 Mac。对于前面的示例,它将是VAG Rounded Std Light。
OS X 比 iOS 消化 TrueType 格式更宽容,所以在极少数情况下,您可能会发现在 OS X 中有效但在 iOS 中无效的字体。如果发生这种情况,请更换字体以查看是否至少您的流程正确。
如何以编程方式加载字体
这解决了字体许可证要求您分发加密字体的情况。
- 第一步是使用您认为合适的任何算法对字体进行加密和解密。
- 将字体加载为 NSData 对象并反转加密。
- 以编程方式注册字体。
以下食谱来自 Marco Arment 的 Loading iOS fonts dynamically。它使字体在 UIFont 和 UIWebView 中可用。相同的代码可用于从 Internet 加载字体。
NSData *inData = /* your decrypted font-file data */;
CFErrorRef error;
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)inData);
CGFontRef font = CGFontCreateWithDataProvider(provider);
if (! CTFontManagerRegisterGraphicsFont(font, &error)) {
CFStringRef errorDescription = CFErrorCopyDescription(error)
NSLog(@"Failed to load font: %@", errorDescription);
CFRelease(errorDescription);
}
CFRelease(font);
CFRelease(provider);
如何加载同族的两种以上字体
这是 iOS 拒绝加载来自同一家族的两种以上字体的情况。
这是来自 stackoverflow 用户 Evadne Wu 的代码解决方法。只需在您的应用程序委托中添加以下内容(注意它使用两个框架):
#import <CoreText/CoreText.h>
#import <MobileCoreServices/MobileCoreServices.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
CTFontManagerRegisterFontsForURLs((__bridge CFArrayRef)((^{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *resourceURL = [[NSBundle mainBundle] resourceURL];
NSArray *resourceURLs = [fileManager contentsOfDirectoryAtURL:resourceURL includingPropertiesForKeys:nil options:0 error:nil];
return [resourceURLs filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSURL *url, NSDictionary *bindings) {
CFStringRef pathExtension = (__bridge CFStringRef)[url pathExtension];
NSArray *allIdentifiers = (__bridge_transfer NSArray *)UTTypeCreateAllIdentifiersForTag(kUTTagClassFilenameExtension, pathExtension, CFSTR("public.font"));
if (![allIdentifiers count]) {
return NO;
}
CFStringRef utType = (__bridge CFStringRef)[allIdentifiers lastObject];
return (!CFStringHasPrefix(utType, CFSTR("dyn.")) && UTTypeConformsTo(utType, CFSTR("public.font")));
}]];
})()), kCTFontManagerScopeProcess, nil);
return YES;
}
以gist 提供。在作者博客中评论:Loading 2+ fonts on iOS from the same font family。
pixeldock.com 提供的另一种更复杂的解决方法:
如果您添加超过 2 种相同字体系列的字体变体(例如
“Normal”、“Bold”和“Extended”),只有最后两种字体变体
您添加到项目中将可用。
如果您看到这种情况,这是您的 SDK 版本的限制,唯一的解决方法是使用 Fontforge 等字体编辑器编辑字体系列。再次,来自pixeldock.com:
- 在 Fontforge 中打开您的字体
- 转到“元素”->“字体信息”并更改“姓氏”字段
- 转到“元素”->“TTF 名称”并更改“家庭”和“首选家庭”字段
- 转到“文件”->“生成字体”并保存您编辑的字体