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

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

系统提供给我们的字体名我们可以通过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. ActivityGroup+LinearLayout实现iphone风格的底部tab菜单

    public class ActsGroup extends ActivityGroup {       private LinearLayout bodyView;     private Line ...

  2. 20 Free Open Source Web Media Player Apps

    free Media Players (Free MP3, Video, and Music Player ...) are cool because they let web developers ...

  3. 文件系统缓存dirty_ratio与dirty_background_ratio两个参数区别

    这两天在调优数据库性能的过程中需要降低操作系统文件Cache对数据库性能的影响,故调研了一些降低文件系统缓存大小的方法,其中一种是通过修改/proc/sys/vm/dirty_background_r ...

  4. 解决TIME_WAIT过多问题

    http://bbs.linuxtone.org/thread-853-1-1.html http://bbs.linuxtone.org/thread-2327-1-1.html

  5. NHibernate教程

    NHibernate教程 一.NHibernate简介 在今日的企业环境中,把面向对象的软件和关系数据库一起使用可能是相当麻烦.浪费时间的.NHibernate是一个面向.Net环境的对象/关系数据库 ...

  6. php 换行 空格分割处理

    <?php function parse_specification($specification){ $rt=array(); $lines=array_filter(preg_split(& ...

  7. Data Structure 之 最优二叉树

    给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. ...

  8. NSURLConnection 网络超时的那些事(转别人整理的)

    NSURLConnection 网络超时的那些事(转别人整理的) 在ios平台上做网络开发最常用的两个类: NSMutableURLRequest *urlRequest = [[NSMutableU ...

  9. IOS NS 字符串 数组 字典 文件 动态 静态 操作

    ios 常用字符串的操作   //将NSData转化为NSString        NSString* str = [[NSString alloc] initWithData:response e ...

  10. Android权限机制

    Android系统是运行在Linux内核上的,Android与Linux分别有自己的一套严格的安全及权限机制, 很多像我这样的新手,尤其是习惯了windows低安全限制的用户,很容易在这方面弄混淆,下 ...