动态下载系统提供的多种中文字体
来源:互联网 发布:l800清零软件 编辑:程序博客网 时间:2024/05/01 13:39
从iOS6开始,苹果开始支持动态下载官方提供的中文字体到系统中。使用苹果官方提供的中文字体,既可以避免版权问题,又可以节省应用体积。该方案适合对有较多需求的应用。
使用动态下载中文字体的API可以动态地向iOS系统中添加字体文件,这些字体文件都是下载到系统的目录中(目录是/private/var/mobile/Library/Assets/com_apple_MobileAsset_Font/),所以并不会造成应用体积的增加。由于字体文件是iOS系统提供的,也免去了字体使用版权的问题。虽然第一次下载相关的中文字体需要一些网络开销和下载时间,但是这些字体下载后可以在所有应用间共享,所以可以预见,随着该API使用的普及,大部分应用都不需要提示用户下载字体,因为很可能这些字体在之前就被其他应用下载下来了。
在官方文档(http://support.apple.com/kb/HT5484?viewlocale=zh_CN)中,苹果列出了提供动态下载和使用的中文字体文件列表。不过由于下载的时候需要使用的名字是PostScript名称,所以如果你真正要动态下载相应的字体的话,还需要使用Mac内自带的应用“字体册”(Font Book)来获得相应字体的PostScript名称。
苹果提供了动态下载代码的Demo工程(https://developer.apple.com/library/ios/samplecode/DownloadFont/Listings/DownloadFont_ViewController_m.html)。
#import "ViewController.h"
#import <CoreText/CoreText.h>
@interface ViewController ()
{
NSString *_errorMessage;
UILabel *_label;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_label = [[UILabelalloc] initWithFrame:CGRectMake(10,30, 300, 30)];
_label.text =@"2016大发大发大发大发大发";
_label.font = [UIFontsystemFontOfSize:12];
_label.backgroundColor = [UIColoryellowColor];
[self.viewaddSubview:_label];
NSString *fontName =@"STXingkai-SC-Light";
if (![selfisFontDownloaded:fontName]) {
[self downloadFont:fontName];
}
}
// 先判断该字体是否已经被下载下来
- (BOOL)isFontDownloaded:(NSString *)fontName
{
UIFont *aFont = [UIFontfontWithName:fontName size:12.0];
if (aFont && ([aFont.fontNamecompare:fontName] == NSOrderedSame || [aFont.familyName compare:fontName] == NSOrderedSame)) {
return YES;
} else {
return NO;
}
}
// 如果该字体已经下载过了,则可以直接使用。否则我们需要先准备下载字体API需要的一些参数
- (void)downloadFont:(NSString *)fontName
{
// 用字体的PostScript名字创建一个Dictionary
NSMutableDictionary *attrs = [NSMutableDictionarydictionaryWithObjectsAndKeys:fontName,kCTFontNameAttribute, nil];
// 创建一个字体描述对象CTFontDescriptorRef
CTFontDescriptorRef desc =CTFontDescriptorCreateWithAttributes((__bridgeCFDictionaryRef)attrs);
// 将字体描述对象放到一个NSMutableArray中
NSMutableArray *descs = [NSMutableArrayarrayWithCapacity:0];
[descs addObject:(__bridgeid)desc];
CFRelease(desc);
// 准备好上面的descs变量后,就可以进行字体的下载了
__block BOOL errorDuringDownload =NO;
CTFontDescriptorMatchFontDescriptorsWithProgressHandler((__bridgeCFArrayRef)descs,NULL, ^bool(CTFontDescriptorMatchingState state,CFDictionaryRef _Nonnull progressParameter) {
double progressValue = [[(__bridgeNSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingPercentage]doubleValue];
if (state ==kCTFontDescriptorMatchingDidBegin) {
NSLog(@"字体已经匹配");
} elseif (state ==kCTFontDescriptorMatchingDidFinish) {
if (!errorDuringDownload) {
NSLog(@"字体%@下载完成", fontName);
dispatch_async(dispatch_get_main_queue(), ^{
// 可以在这里修改UI控件的字体
_label.font = [UIFontfontWithName:fontName size:12];
});
}
} elseif (state ==kCTFontDescriptorMatchingWillBeginDownloading) {
NSLog(@"字体开始下载");
} elseif (state ==kCTFontDescriptorMatchingDidFinishDownloading) {
NSLog(@"字体下载完成");
} elseif (state ==kCTFontDescriptorMatchingDownloading) {
NSLog(@"下载进度 %.0f%%", progressValue);
} elseif (state ==kCTFontDescriptorMatchingDidFailWithError) {
NSError *error = [(__bridgeNSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingError];
if (error != nil) {
_errorMessage = [error description];
} else {
_errorMessage =@"ERROR MESSAGE IS NOT AVAILABLE!";
}
// 设置标志
errorDuringDownload = YES;
NSLog(@"下载错误: %@",_errorMessage);
}
return YES;
});
}
- 动态下载系统提供的多种中文字体
- iOS 开发之动态下载系统提供的多种中文字体
- iOS字体 动态下载系统提供的多种中文字体
- iOS中动态下载系统提供的多种中文字体
- iOS 动态下载系统提供的多种中文字体
- 动态下载苹果提供的多种中文字体
- 动态下载苹果提供的多种中文字体
- 动态下载苹果提供的多种中文字体
- 动态下载苹果提供的多种中文字体
- 动态下载苹果提供的多种中文字体
- 动态下载苹果提供的多种中文字体
- 动态下载苹果提供的多种中文字体
- 【读书笔记】iOS-UIFont-动态下载系统提供的多种中文字体网址
- 应用内动态下载苹果提供的多种中文字体
- ios动态下载多种中文字体
- iOS 动态下载系统的中文字体
- 【读书笔记】iOS-UIFont-动态下载系统提供的字体-官方代码
- 常见系统中文字体的英文名
- https生成证书及TOMCAT配置
- java web点击链接用js判断用户是否已经登录 (js获取session及判断是否为空)
- 修改Ubuntu侧边栏图标提示文字
- iOS 编码规范
- 郑重道歉:聚类和异常值分析(Anselin Local Moran's I)修正篇
- 动态下载系统提供的多种中文字体
- TestDESede
- 设计模式-享元
- hdu 2399
- MyBatis日期用法技巧
- POJ-3259
- Web 开发学习 需要掌握的知识 01
- 低功耗蓝牙包括的术语及概念
- Android开发中一些被冷落但却很有用的类和方法