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

一、场景、当前众多APP使用情况


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

1、字体文件通常比较大,10M - 20M是一个常见的字体库的大小。大部分的非游戏的app体积都集中在10M以内,因为字体文件的加入而造成应用体积翻倍让人感觉有些不值。

如果只是很少量的按钮字体需要设置,可以用一些工具把使用到的汉字字体编码从字体库中抽取出来,以节省体积。但如果是一些变化的内容需要自定义的字体,那就只有打包整个字体库了。 2、中文的字体通常都是有版权的。在应用中加入特殊中文字体还需要处理相应的版权问题。对于一些小公司或个人开发者来说,这是一笔不小的开销。

以上两点造成App Store里面使用特殊中文字库的iOS应用较少。现在通常只有阅读类的应用才会使用特殊中文字库。 但其实从iOS6开始,苹果就支持动态下载中文字体到系统中。只是苹果一直没有公开相应的API。最终,相应的API在今年的WWDC大会上公开,接下来就让我们来一起了解这个功能。


二、功能介绍

使用动态下载中文字体的API可以动态地向iOS系统中添加字体文件,

这些字体文件都是下载到系统的目录中(目录是/private/var/mobile/Library/Assets/com_apple_MobileAsset_Font/),所以并不会造成应用体积的增加。并且,由于字体文件是iOS系统提供的,也免去了字体使用版权的问题。

虽然第一次下载相关的中文字体需要一些网络开销和下载时间,但是这些字体文件下载后可以在所有应用间共享,所以可以遇见到,随着该API使用的普及,大部分应用都不需要提示用户下载字体,因为很可能这些字体在之前就被其它应用下载下来了。

三、字体列表

这个链接中,苹果列出了提供动态下载和使用中文字体文件列表。不过,由于下载的时候需要使用的名字是PostScript名称,所以如果你真正要动态下载相应的字体的话,还需要使用Mac内自带的应用“字体册“来获得相应字体的PostScript名称。如下显示了从”字体册“中获取《兰亭黑-简 特黑》字体的PostScript名称的截图:
tip:不知从OS x哪个版本开始,字体册里只能查看了,不能查看到PostScript名称了。所以看到效果之后,需要在百度一下。
四、API介绍--使用,重点。。。。
苹果提供的动态下载代码的Demo工程 链接在这里。将此Demo工程下载下来,即可学习相应API的使用。下面我对该工程中相应API做简单的介绍。

(1)假如我们现在要下载娃娃体字体,它的PostScript名称为 DFWaWaSC-W5 。具体的步骤如下:

- (BOOL)isFontDownloaded:(NSString *)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;     } }

(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)desc];

    CFRelease(desc);

(2)准备好上面的descs变量后,则可以进行字体的下载了,代码如下:

__block BOOL errorDuringDownload =NO;

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

    

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

    

    if (state == kCTFontDescriptorMatchingDidBegin) {

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

    } elseif (state == kCTFontDescriptorMatchingDidFinish) {

        if (!errorDuringDownload) {

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

        }

    } elseif (state == kCTFontDescriptorMatchingWillBeginDownloading) {

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

    } elseif (state == kCTFontDescriptorMatchingDidFinishDownloading) {

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

        dispatch_async( dispatch_get_main_queue(), ^ {

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

        });

    } elseif (state == kCTFontDescriptorMatchingDownloading) {

        NSLog(@"下载进度 %.0f%% ", progressValue);

    } elseif (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 (BOOL)YES;

});


tip:通常需要在下载完字体后开始使用字体,一般是将相应代码放到 kCTFontDescriptorMatchingDidFinish 那个条件中做,可以象苹果官网的示例代码上那样,用GCD来改UI的逻辑,也可以发Notification来通知相应的Controller
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值