结合书本与苹果官方给的例子后,总结下下载的方法。

苹果给我们提供了很多漂亮的字体,只是有些字体设备并没有内置,需要我们去下载才行。

系统提供给我们的字体名我们可以通过mac系统提供的字体册来查阅。

得到我们想要的字体后就可以在我们的设备上进行下载了。这里要说一下,设备字体下载后是所有应用都可以使用的,而且字体的目录并不是我们APP的目录,因此并不会增大我们应用所需的空间。

这里结合着苹果官方所给例子来简述一下(官方例子):

事例中给我们预定了几种字体来让我们下载

 - (void)viewDidLoad
{
[super viewDidLoad]; self.fontNames = [[NSArray alloc] initWithObjects:
@"STXingkai-SC-Light",
@"DFWaWaSC-W5",
@"FZLTXHK--GBK1-0",
@"STLibian-SC-Regular",
@"LiHeiPro",
@"HiraginoSansGB-W3",
nil];
self.fontSamples = [[NSArray alloc] initWithObjects:
@"汉体书写信息技术标准相",
@"容档案下载使用界面简单",
@"支援服务升级资讯专业制",
@"作创意空间快速无线上网",
@"兙兛兞兝兡兣嗧瓩糎",
@"㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩",
nil];
}

然后在表示图的didSelectedRowAtIndexPath委托中来调用验证字体的方法

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self asynchronouslySetFontName:_fontNames[indexPath.row]]; // Dismiss the keyboard in the text view if it is currently displayed
if ([self.fTextView isFirstResponder])
[self.fTextView resignFirstResponder];
}

重点来看asynchronouslySetFontName方法,首先先验证是否存在该字体

UIFont* aFont = [UIFont fontWithName:fontName size:.];
// If the font is already downloaded
if (aFont && ([aFont.fontName compare:fontName] == NSOrderedSame || [aFont.familyName compare:fontName] == NSOrderedSame)) {
// Go ahead and display the sample text.
NSUInteger sampleIndex = [_fontNames indexOfObject:fontName];
_fTextView.text = [_fontSamples objectAtIndex:sampleIndex];
_fTextView.font = [UIFont fontWithName:fontName size:.];
return;
}

如果不存在改字体,那么aFont将会返回nil不执行该判断语句,如果存在就直接使用并返回。

接下来看看不存在时,是如何进行字体下载的:

     // Create a dictionary with the font's PostScript name.
NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithObjectsAndKeys:fontName, kCTFontNameAttribute, nil]; // Create a new font descriptor reference from the attributes dictionary.
CTFontDescriptorRef desc = CTFontDescriptorCreateWithAttributes((__bridge CFDictionaryRef)attrs); NSMutableArray *descs = [NSMutableArray arrayWithCapacity:];
[descs addObject:(__bridge id)desc];
CFRelease(desc); __block BOOL errorDuringDownload = NO;

首先配置我们需要下载字体的属性,将fontName作为值kCTFontNameAttribute作为键放入字典中。

然后使用CTFontDescriptorCreateWithAttribute来创建一个字体描述器并将NSDictionary转为CFDictionaryRef作为参数传入。

将CTFontDescriptorRef放入数组中(同样需要转为对象)。

接下来需要调用

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

来判断是否已经匹配到了字体,第一个参数使我们的描述字体数组,第二个设为NULL,第三个参数为回调block。

block的state参数为当前匹配的状态,progressParmeter为进度参数,其中也包含错误信息。

我们所用到的state有下面这些:

kCTFontDescriptorMatchingDidBegin       //开始匹配

kCTFontDescriptorMatchingDidFinish      //匹配成功

kCTFontDescriptorMatchingWillBeginDownloading//字体开始下载

kCTFontDescriptorMatchingDidFinishDownloading//字体下载成功

kCTFontDescriptorMatchingDownloading    //下载中

kCTFontDescriptorMatchingDidFailWithError  //匹配失败

这些状态的回调顺序为

kCTFontDescriptorMatchingDidBegin

kCTFontDescriptorMatchingWillBeginDownloading

kCTFontDescriptorMatchingDownloading(多次调用)

kCTFontDescriptorMatchingDidFinishDownloading

kCTFontDescriptorMatchingDidFinish

其中kCTFontDescriptorMatchingDownloading会多次调用,来方便我们更新下载的进度条。

没接到一个回调状态我们就可以进行相应的UI处理,可以使用block,也可以使用通知。

progressParmeter我们用到了两个属性

因为它是CFDictionaryRef,所以首先我们应该先把它转为NSDictionary

当前下载进度的键为kCTFontDescriptorMatchingPercentage

错误对象的键为kCTFontDescriptorMatchingError

如果返回的状态是kCTFontDescriptorMatchingDidFailWithError,那我们就可以通过kCTFontDescriptorMatchingError来得到错误日志了。

IOS字体下载的更多相关文章

  1. iOS 字体下载

    iOS可以动态的为系统下载字体,这些字体都下载到了系统的目录下,并且可以被其他应用公用 来看下如何实现动态下载: // 创建下载字体请求描述的准备 NSMutableDictionary *attrs ...

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

    使用系统提供的中文字体,既可避免版权问题,又可以减小应用体积 #pragma mark - 判断字体是否已经被下载 - (BOOL)isFontDownLoaded:(NSString *)fontN ...

  3. 一文让你彻底了解iOS字体相关知识

    写本文的契机主要是把自己整理的关于iOS字体方面的知识不断更新写在这篇博文中,用来自己以后查阅. 一.iOS原生字体展示 在label中选择字体的font,并把font由system改成custom后 ...

  4. 如何为ios酷我音乐盒下载导出的音乐文件(使用Java程序设计)

    这个工具已经准备第二版,读者了解编程软件,可以直接使用,请阅读和使用这个场地 http://blog.csdn.net/jzj1993/article/details/44459983 本文所涉及内容 ...

  5. iOS字体大小

    1,iOS 字体大小单位是pt——磅. 英文字体的1磅,相当于1/72 英寸,约等于1/2.8mm. px:相对长度单位.像素(Pixel).(PS字体) pt:绝对长度单位.点(Point).(iO ...

  6. iOS字体加载三种方式

    静态加载 动态加载 动态下载苹果提供的多种字体 其他 打印出当前所有可用的字体 检查某字体是否已经下载 这是一篇很简短的文章,介绍了 iOS 自定义字体加载的三种方式. 静态加载 这个可以说是最简单最 ...

  7. (转)iOS字体

    一.iOS原生字体展示 在 label中选择字体的font,并把font由system改成custom后,就能在family中看到72种特殊字体.这些里面就有很炫的字体,但 是全部是只针对英文数字,对 ...

  8. 仿IOS圆形下载进度条

    /** * Created by C058 on 2016/5/25. */ public class MyHoriztalProgressBar extends ProgressBar { priv ...

  9. iOS 字体设置

    使用无衬线字体 body {     font-family: "Helvetica Neue", Helvetica, STHeiTi, sans-serif; }  iOS 4 ...

随机推荐

  1. Android ViewPager 应该及技巧

    1.   android 中的ViewPager 功能类似于iOS中的scrollView,实现最主要的页面的左右滑动功能.该类存在于Google的兼容包里面,所以在引用时记得在BuilldPath中 ...

  2. 推荐资料——最受网友力荐的30份HTML前端开发资料

    w3cmark最近会新增一个栏目,专注于搜集前端资源的下载,包括和前端相关的电子书.文档PPT.手册.视频教程等等.而下载的媒介是用微博的微盘,至于为什么选择微盘的,那是因为和微博关联起来,通过微盘上 ...

  3. Google Map和桌面组件 Android开发教程

    本文节选于机械工业出版社推出的<Android应用开发揭秘>一 书,作者为杨丰盛.本书内容全面,详细讲解了Android框架.Android组件.用户界面开发.游戏开发.数据存储.多媒体开 ...

  4. CSS3实现自定义Checkbox和Radiobox

    我们知道浏览器自带的Checkbox复选框不怎么美观(这或许是我们看习惯了的缘故),而且复选框在不同的浏览器上显示的样式又有很大的差异,由于目前越来越多的人开始接受支持CSS3的现代浏览器,所以今天就 ...

  5. 剑指 offer set 4 矩形覆盖

    总结 1. 斐波那契数列的变形题, 但是稍有隐晦, 有点意思 2. 求解 f(3) 时, 最后一块矩形可以竖着放, 也可以两块矩形横着放, 分别对应于 f(2) 和 f(1) ------------ ...

  6. centos 服务器配置(二) 之ftp配置

    Centos配置vsftpd服务器 1.通过yum来安装vsftpd [root@localhost ~]# yum -y install vsftpd 加-y是因为出现提示默认直接按Y.这里yum安 ...

  7. Photoshop-制作图片圆角2种方法[转]

    方案一:       使用选区和蒙版相结合,用图章制作圆角选区,删除多余部分 效果: 实现步骤: 一.如果是直接在已有的图片上面编辑则看下图,否则跳过此不 二.用矩形工具选择需要保留的图片内容 三.选 ...

  8. 全栈一路坑之使用django创建博客

    最近在看一篇全栈增长工程师实战,然后学习里面的项目,结果发现作者用的技术太过老旧,好多东西都已经被抛弃了,所以结合着官方文档和自己的一些理解将错误的信息替换一下,边写边学习 准备工作和工具 作者说需要 ...

  9. ecshop被加入了黑链

    朋友一个ecshop网站被攻击了,查看代码如下: <?php $password = "1";//设置密码 error_reporting(E_ERROR); header( ...

  10. JSF HelloWord

    JSF(Java Server Faces)是一种用于构建Web应用程序的新标准Java框架.提供了一种以组件为中心来开发Java Web的用户界面的方法,从而简化了开发.   JSF是Java We ...