使用动态下载中文字体的API可以动态地向iOS系统中添加字体文件,这些字体文件都是下载到系统的目录中(目录是/private/var/mobile/Library/Assets/com_apple_MobileAsset_Font/),所以并不会造成应用体积的增加。并且,由于字体文件是iOS系统提供的,也免去了字体使用版权的问题。虽然第一次下载相关的中文字体需要一些网络开销和下载时间,但是这些字体文件下载后可以在所有应用间共享,所以可以遇见到,随着该API使用的普及,大部分应用都不需要提示用户下载字体,因为很可能这些字体在之前就被其它应用下载下来了。
苹果官方提供的中文字体库有效的解决了在之前的开发中,由于字体文件较大导致程序包过大和中文字体的版权等问题。
由于动态下载系统提供的多种中文字体时,使用的字体名称是PostScript名称,因此需要使用Mac自带的应用字体册查看字体相对应的PostScript名称。
使用API要导入的头文件:
#import <CoreText/CoreText.h>
API的使用:
1.判断该字体是否已经被下载下来了,代码如下:
UIFont* aFont = [UIFont fontWithName:fontName size:12.];
if (aFont && ([aFont.fontName compare:fontName] == NSOrderedSame || [aFont.familyName compare:fontName] == NSOrderedSame)) {
NSUInteger sampleIndex = [_fontNames indexOfObject:fontName];
_fTextView.text = [_fontSamples objectAtIndex:sampleIndex];
_fTextView.font = [UIFont fontWithName:fontName size:24.];
return;
}
2.如果字体已经下载过,则可以直接使用。如果没有下载过,需要准备从API下载字体所需要的参数。
// 用将要下载的字体的PostScript名字创建一个字典
NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithObjectsAndKeys:fontName, kCTFontNameAttribute, nil];
// 为要下载的字体创建一个描述对象 CTFontDescriptorRef
CTFontDescriptorRef desc = CTFontDescriptorCreateWithAttributes((__bridge CFDictionaryRef)attrs);
NSMutableArray *descs = [NSMutableArray arrayWithCapacity:0];
// 将描述对象添加到数组中去
[descs addObject:(__bridge id)desc];
CFRelease(desc);
3.进行字体的下载,代码如下所示:
__block BOOL errorDuringDownload = NO;
CTFontDescriptorMatchFontDescriptorsWithProgressHandler( (__bridge CFArrayRef)descs, NULL, ^(CTFontDescriptorMatchingState state, CFDictionaryRef progressParameter) {
double progressValue = [[(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingPercentage] doubleValue];
if (state == kCTFontDescriptorMatchingDidBegin) {
dispatch_async( dispatch_get_main_queue(), ^ {
NSLog(@"下载进度:%@",fontName);
});
} else if (state == kCTFontDescriptorMatchingDidFinish) {
dispatch_async( dispatch_get_main_queue(), ^ {
// 下载完成,在此处修改UI控件的字体
if (!errorDuringDownload) {
NSLog(@"%@ 下载完毕", fontName);
}
});
} else if (state == kCTFontDescriptorMatchingWillBeginDownloading)
{
dispatch_async( dispatch_get_main_queue(), ^ {
NSLog(@"开始下载");
});
} else if (state == kCTFontDescriptorMatchingDidFinishDownloading)
{
dispatch_async( dispatch_get_main_queue(), ^ {
NSLog(@"正在下载");
});
} else if (state == kCTFontDescriptorMatchingDownloading) {
dispatch_async( dispatch_get_main_queue(), ^ {
// 下载的进度
NSLog(@"下载进度 %.0f%% complete", progressValue);
});
} else if (state == kCTFontDescriptorMatchingDidFailWithError) {
NSError *error = [(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingError];
if (error != nil) {
_errorMessage = [error description];
} else {
_errorMessage = @"ERROR MESSAGE IS NOT AVAILABLE!";
}
// 设置标志
errorDuringDownload = YES;
dispatch_async( dispatch_get_main_queue(), ^ {
NSLog(@"下载错误: %@", _errorMessage);
});
}
return (bool)YES;
});
在demo中下载了多种字体,点击显示不同的效果,如下所示: