从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 {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

_label = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 300, 30)];

_label.text = @"2016大发大发大发大发大发";

_label.font = [UIFont systemFontOfSize:12];

_label.backgroundColor = [UIColor yellowColor];

[self.view addSubview:_label];

NSString *fontName = @"STXingkai-SC-Light";

if (![self isFontDownloaded:fontName]) {

[self downloadFont:fontName];

}

}

// 先判断该字体是否已经被下载下来

- (BOOL)isFontDownloaded:(NSString *)fontName

{

UIFont *aFont = [UIFont fontWithName:fontName size:12.0];

if (aFont && ([aFont.fontName compare:fontName] == NSOrderedSame || [aFont.familyName compare:fontName] == NSOrderedSame)) {

return YES;

} else {

return NO;

}

}

// 如果该字体已经下载过了,则可以直接使用。否则我们需要先准备下载字体API需要的一些参数

- (void)downloadFont:(NSString *)fontName

{

// 用字体的PostScript名字创建一个Dictionary

NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithObjectsAndKeys:fontName, kCTFontNameAttribute, nil];

// 创建一个字体描述对象CTFontDescriptorRef

CTFontDescriptorRef desc = CTFontDescriptorCreateWithAttributes((__bridge CFDictionaryRef)attrs);

// 将字体描述对象放到一个NSMutableArray中

NSMutableArray *descs = [NSMutableArray arrayWithCapacity:0];

[descs addObject:(__bridge id)desc];

CFRelease(desc);

// 准备好上面的descs变量后,就可以进行字体的下载了

__block BOOL errorDuringDownload = NO;

CTFontDescriptorMatchFontDescriptorsWithProgressHandler((__bridge CFArrayRef)descs, NULL, ^bool(CTFontDescriptorMatchingState state, CFDictionaryRef  _Nonnull progressParameter) {

double progressValue = [[(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingPercentage] doubleValue];

if (state == kCTFontDescriptorMatchingDidBegin) {

NSLog(@"字体已经匹配");

} else if (state == kCTFontDescriptorMatchingDidFinish) {

if (!errorDuringDownload) {

NSLog(@"字体%@ 下载完成", fontName);

dispatch_async(dispatch_get_main_queue(), ^{

// 可以在这里修改UI控件的字体

_label.font = [UIFont fontWithName:fontName size:12];

});

}

} else if (state == kCTFontDescriptorMatchingWillBeginDownloading) {

NSLog(@"字体开始下载");

} else if (state == kCTFontDescriptorMatchingDidFinishDownloading) {

NSLog(@"字体下载完成");

} else if (state == kCTFontDescriptorMatchingDownloading) {

NSLog(@"下载进度 %.0f%%", 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;

NSLog(@"下载错误: %@", _errorMessage);

}

return YES;

});

}

动态下载系统提供的多种中文字体相关推荐

  1. iOS 开发之动态下载系统提供的多种中文字体

    使用动态下载中文字体的API可以动态地向iOS系统中添加字体文件,这些字体文件都是下载到系统的目录中(目录是/private/var/mobile/Library/Assets/com_apple_M ...

  2. iOS 动态下载系统提供的多种中文字体

    作者刘文涛 转载请注明出处 一.功能简介 1.前言 为了实现更好的字体效果,有些应用在自己的应用资源包中加入了字体文件.但自己打包字体文件比较麻烦,原因在于: 1.字体文件通常比较大,10~20M是常 ...

  3. iOS字体 动态下载系统提供的多种中文字体

    一.场景.当前众多APP使用情况 在WWDC的内容公开之前,大家都以为iOS系统里面只有一种中文字体.为了达到更好的字体效果,有些应用在自己的应用资源包中加入了字体文件.但自己打包字体文件比较麻烦,原 ...

  4. 动态下载苹果提供的多种中文字体

    引言 在今年WWDC的内容公开之前,大家都以为iOS系统里面只有一种中文字体.为了达到更好的字体效果,有些应用在自己的应用资源包中加入了字体文件.但自己打包字体文件比较麻烦,原因在于: 1.字体文件通 ...

  5. UIFontDownLoad ----动态下载系统提供的字体

    程序运行结果如下 : 当点击对应单元格实现下载对应的字体. 控制台打印结果如下 : 2015-10-05 11:14:04.132 UIFontDownLoad[12721:86827] state ...

  6. ios动态下载多种中文字体

    引言 在今年 WWDC 的内容公开之前,大家都以为 iOS 系统里面只有一种中文字体.为了达到更好的字体效果,有些应用在自己的应用资源包中加入了字体文件.但自己打包字体文件比较麻烦,原因在于: 1.字 ...

  7. iOS 动态下载系统的中文字体

    /** APP中加入文件字体,使自己打包文件字体比较麻烦,原因在于: 1.字体库文件一般比较大,对于一般的APP相当于体积翻倍了,得不偿失 2.中文字体通常都有版权,需要处理相应的版权问题 所以我们可 ...

  8. python中文字体下载_解决Linux系统下python matplotlib中文字体显示问题

    最近想学习一些python数据分析的内容,就弄了个爬虫爬取了一些数据,并打算用Anaconda一套的工具(pandas, numpy, scipy, matplotlib, jupyter)等进行一些 ...

  9. 【读书笔记】iOS-UIFont-动态下载系统提供的字体-官方代码

    一,工程目录 二,AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOption ...

最新文章

  1. mysql 查询不使用索引_简单的mySQL查询不使用索引
  2. 线性代数 矩阵 行列式基本知识(转)
  3. 英特尔 AMT 漏洞比任何人想象的还要严重
  4. tomcat7,8 centos7 配置apr极好教程
  5. 计算机二级考试Python编程试题解读:使用turtle库绘制三角形
  6. pycharm常用快捷键总结
  7. [记录]HAproxy负载均衡配置教程
  8. mysql 删库跑路_如何避免删库跑路呢?mysql使用bin
  9. 浅显易懂——泰勒展开式
  10. 图像处理公共数据库下载地址集锦
  11. python垃圾分类源代码_Python 垃圾分类查询
  12. cocos creator设置网络头像
  13. 希捷原装移动硬盘拆壳
  14. 怎么测量一个程序的启动时间?
  15. 思维导图告诉你《微微一笑很倾城》为什么火?
  16. VPI TransmissionMaker光纤通信算法仿真 均衡,载波相位恢复
  17. python 首次登陆outlook 脚本_Python 黑魔法,执行任意代码都会自动念上一段 平安经...
  18. 重装Ubuntu时如何保留/home分区中的数据
  19. 测试胖虎原来在教你,如何使用技术代码情人节在线撩妹520
  20. 【附源码】计算机毕业设计java智慧小区团购系统设计与实现

热门文章

  1. [汉语]类书、叙词表、分类词典、同义词、反义词词典...
  2. 线性表的练习--学生成绩统计
  3. tomcat启动一闪而过的解决方案
  4. 天猫淘宝成农产品销售主阵地,占市场份额75%,是拼多多43倍
  5. 装部署VMware vSphere 5.5文档 (6-2) 为IBM x3850 X5服务器安装配置VMware ESXi
  6. 关于Excel打开UTF-8格式的文件乱码
  7. 10-3 B1-5查询客户的订单情况
  8. ESD保护芯片BAT54S/BAV99和电平转换芯片SN74AVC1T45
  9. 为何 Linus 一个人就能写出这么强的系统,中国却做不出来?
  10. Windows电脑必装的4款软件,个个都是精品!