作者刘文涛
转载请注明出处

一、功能简介

1.前言

为了实现更好的字体效果,有些应用在自己的应用资源包中加入了字体文件。但自己打包字体文件比较麻烦,原因在于:
1.字体文件通常比较大,10~20M是常见的字体库大小。如果只是很少量的按钮字体需要设置,可以用一些工具把使用的汉字字体编码从字体库中抽取出来,以节省体积。但是如果是一些变化的内容需要自定义的字体,那么就只能打包整个字体库了。
2.中文字体都是有版权的,在应用中加入特殊中文字体还需要处理相应的版权问题。
从iOS6开始,苹果开始支持动态下载官方提供的中文字体到系统中。使用苹果官方的中文字体,即可以避免版权问题,又可以节省应用体积。

2.功能介绍

使用动态下载中文字体的API可以动态的向iOS系统中添加字体文件,这些字体文件都是下载带到系统的目录中(模拟器中运行的目录是
/Users/iosdev/Library/Developer/CoreSimulator/Devices/46DE5A8B-1C81-41F0-994D-BD6502EDEB58/data/Library/Assets/com_apple_MobileAsset_Font3/6da938c9f7fa36cae9ee066f7d75195c222fec07.asset/AssetData/WawaSC-Regular.otf),所以并不会造成应用体积的增加。虽然第一次下载相关的中文字体需要一些网络开销和下载时间,但是这些字体文件下载完后可以在所有应用间共享,所以大部分应用都不需提示用户下载字体,因为很可能这些字体在之前被其他应用下载过了。

3.字体列表

在官方文档中,苹果列出了提供动态下载和使用的中文字体文件列表。不过,由于下载的时候需要使用的名字是PostScript名称,所以如果你真正要动态下载相应的字体的话,还需要使用Mac内自带的应用字体册(Font Book)来获得相应字体的PostScript名称。下面是从字体册中获取“娃娃体-简 常规体”字体的PostScript名称的截图。

二、使用教程

1.相关API介绍

苹果提供了动态下载代码的Demo工程。将此Demo工程下载下来,可以学习相关API的使用。下面对该工程中相关API做简单的介绍。
假如我们现在要下载“娃娃体”,他的PostScript名称为“DFWaWaSC-W5”。具体操作步骤如下。
1.我们先判断该字体是否已经被下载下来,示例代码:

//判断字体是否已经被下载
- (BOOL)isFontDownloaded:(NSString *)fontName{UIFont *aFont = [UIFont fontWithName:fontName size:12.];
if (aFont && ([aFont.fontName compare:fontName] == NSOrderedSame || [aFont.familyName compare:fontName] == NSOrderedSame)) {return YES;
}else{return NO;
}
}

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

//用字体的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 _Nonnull)desc];
CFRelease(desc);

3.准备好上面的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];switch (state) {case kCTFontDescriptorMatchingDidBegin://字体已经匹配break;case kCTFontDescriptorMatchingWillBeginDownloading://字体开始下载break;case kCTFontDescriptorMatchingDownloading:NSLog(@" 下载进度 %.0f",progressValue);break;case kCTFontDescriptorMatchingDidFinishDownloading://字体下载完成break;case kCTFontDescriptorMatchingDidFinish:{//字体已经下载完成if (!errorDuringDownload) {NSLog(@"字体%@ 已经下载完成",fontName);dispatch_async( dispatch_get_main_queue(), ^ {// 可以在这里修改 UI 控件的字体_label.font = [UIFont fontWithName:_postName size:14];return ;});}}break;case 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);}break;default:break;}return YES;
});

通常需要在下载完字体后开始使用字体,一般是将相应的代码放到kCTFontDescriptorMatchingDidFinish 条件中,可以像苹果官方Demo那样,用GCD来修改UI逻辑,也可以发 Notification 来通知相应的Controller。
程序运行截图:

本文参考《iOS开发进阶》– 唐巧
本文demo下载地址

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

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

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

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

    从iOS6开始,苹果开始支持动态下载官方提供的中文字体到系统中.使用苹果官方提供的中文字体,既可以避免版权问题,又可以节省应用体积.该方案适合对有较多需求的应用. 使用动态下载中文字体的API可以动态 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. python startswith
  2. 【Python】编程笔记4
  3. 国家开放大学2021春1009离散数学(本)题目
  4. Java设计模式笔记(4)模版方法模式
  5. php $rs1- gt eof,PHP_PHP速成大法,简单介绍一下PHP的语法 1、嵌 - phpStudy
  6. C++面向对象程序设计课程笔记(第三周)
  7. 正则表达式匹配连续相同字符
  8. dw01均衡电路_基于DW01芯片的锂电池保护电路设计
  9. 计算机管理员命令符怎么关机,详细教您电脑关机命令是什么
  10. 阿里云OSS浏览图片报403错误的解决方法
  11. vue 阻止输入框冒泡
  12. 不要随便借出你的帐号
  13. Unity 基础 之 xml 使用 Office Excel 轻松编辑保存 xml 数据,并解析读取数据
  14. 相亲网站平台制作建设,第九篇
  15. Android面试整理
  16. 计算机工程与网络学术会议,2015第五届计算机工程与网络国际学术会议
  17. 一定要用Chrome吗?有了这些网页翻译插件,任意浏览器都能畅快玩耍
  18. 小白之-----------shell脚本批量管理服务器
  19. Python学习日记 Day1
  20. Tcl经典报错 之 extra characters after close-quote

热门文章

  1. 一文看懂:零代码平台是什么?怎么选?
  2. oracle中触发器的创建,Oracle触发器创建及其功能
  3. Windows Azure Platform (四) Windows Azure架构
  4. 100人局域网(企业)至少需要多少带宽?
  5. 法拉第PK特斯拉,美产与国产谁能取胜?
  6. mediawiki mysql配置_Mediawiki 常见配置功能
  7. 经典Ghost XP
  8. 一个很好用的网站:大英百科全书
  9. Java IO流--数据读写(字符/字节流/二进制文件)
  10. 基于HTML电商购物项目的设计与实现——html+css+javascript+jquery+bootstarp响应式图书商城