动态下载系统提供的多种中文字体
从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;
});
}
动态下载系统提供的多种中文字体相关推荐
- iOS 开发之动态下载系统提供的多种中文字体
使用动态下载中文字体的API可以动态地向iOS系统中添加字体文件,这些字体文件都是下载到系统的目录中(目录是/private/var/mobile/Library/Assets/com_apple_M ...
- iOS 动态下载系统提供的多种中文字体
作者刘文涛 转载请注明出处 一.功能简介 1.前言 为了实现更好的字体效果,有些应用在自己的应用资源包中加入了字体文件.但自己打包字体文件比较麻烦,原因在于: 1.字体文件通常比较大,10~20M是常 ...
- iOS字体 动态下载系统提供的多种中文字体
一.场景.当前众多APP使用情况 在WWDC的内容公开之前,大家都以为iOS系统里面只有一种中文字体.为了达到更好的字体效果,有些应用在自己的应用资源包中加入了字体文件.但自己打包字体文件比较麻烦,原 ...
- 动态下载苹果提供的多种中文字体
引言 在今年WWDC的内容公开之前,大家都以为iOS系统里面只有一种中文字体.为了达到更好的字体效果,有些应用在自己的应用资源包中加入了字体文件.但自己打包字体文件比较麻烦,原因在于: 1.字体文件通 ...
- UIFontDownLoad ----动态下载系统提供的字体
程序运行结果如下 : 当点击对应单元格实现下载对应的字体. 控制台打印结果如下 : 2015-10-05 11:14:04.132 UIFontDownLoad[12721:86827] state ...
- ios动态下载多种中文字体
引言 在今年 WWDC 的内容公开之前,大家都以为 iOS 系统里面只有一种中文字体.为了达到更好的字体效果,有些应用在自己的应用资源包中加入了字体文件.但自己打包字体文件比较麻烦,原因在于: 1.字 ...
- iOS 动态下载系统的中文字体
/** APP中加入文件字体,使自己打包文件字体比较麻烦,原因在于: 1.字体库文件一般比较大,对于一般的APP相当于体积翻倍了,得不偿失 2.中文字体通常都有版权,需要处理相应的版权问题 所以我们可 ...
- python中文字体下载_解决Linux系统下python matplotlib中文字体显示问题
最近想学习一些python数据分析的内容,就弄了个爬虫爬取了一些数据,并打算用Anaconda一套的工具(pandas, numpy, scipy, matplotlib, jupyter)等进行一些 ...
- 【读书笔记】iOS-UIFont-动态下载系统提供的字体-官方代码
一,工程目录 二,AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOption ...
最新文章
- mysql 查询不使用索引_简单的mySQL查询不使用索引
- 线性代数 矩阵 行列式基本知识(转)
- 英特尔 AMT 漏洞比任何人想象的还要严重
- tomcat7,8 centos7 配置apr极好教程
- 计算机二级考试Python编程试题解读:使用turtle库绘制三角形
- pycharm常用快捷键总结
- [记录]HAproxy负载均衡配置教程
- mysql 删库跑路_如何避免删库跑路呢?mysql使用bin
- 浅显易懂——泰勒展开式
- 图像处理公共数据库下载地址集锦
- python垃圾分类源代码_Python 垃圾分类查询
- cocos creator设置网络头像
- 希捷原装移动硬盘拆壳
- 怎么测量一个程序的启动时间?
- 思维导图告诉你《微微一笑很倾城》为什么火?
- VPI TransmissionMaker光纤通信算法仿真 均衡,载波相位恢复
- python 首次登陆outlook 脚本_Python 黑魔法,执行任意代码都会自动念上一段 平安经...
- 重装Ubuntu时如何保留/home分区中的数据
- 测试胖虎原来在教你,如何使用技术代码情人节在线撩妹520
- 【附源码】计算机毕业设计java智慧小区团购系统设计与实现
热门文章
- [汉语]类书、叙词表、分类词典、同义词、反义词词典...
- 线性表的练习--学生成绩统计
- tomcat启动一闪而过的解决方案
- 天猫淘宝成农产品销售主阵地,占市场份额75%,是拼多多43倍
- 装部署VMware vSphere 5.5文档 (6-2) 为IBM x3850 X5服务器安装配置VMware ESXi
- 关于Excel打开UTF-8格式的文件乱码
- 10-3 B1-5查询客户的订单情况
- ESD保护芯片BAT54S/BAV99和电平转换芯片SN74AVC1T45
- 为何 Linus 一个人就能写出这么强的系统,中国却做不出来?
- Windows电脑必装的4款软件,个个都是精品!