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

使用动态下载中文字体的API可以动态地向iOS系统中添加字体文件,这些字体文件都是下载到系统的目录中(目录是/private/var/mobile/Library/Assets/com_apple_MobileAsset_Font/),所以并不会造成应用体积的增加。并且,由于字体文件是iOS系统提供的,也免去了字体使用版权的问题。虽然第一次下载相关的中文字体需要一些网络开销和下载时间,但是这些字体文件下载后可以在所有应用间共享,所以可以遇见到,随着该API使用的普及,大部分应用都不需要提示用户下载字体,因为很可能这些字体在之前就被其它应用下载下来了。
苹果官方提供的中文字体库有效的解决了在之前的开发中,由于字体文件较大导致程序包过大和中文字体的版权等问题。
由于动态下载系统提供的多种中文字体时,使用的字体名称是PostScript名称,因此需要使用Mac自带的应用字体册查看字体相对应的PostScript名称。
这里写图片描述

使用API要导入的头文件:

#import <CoreText/CoreText.h>

API的使用:
1.判断该字体是否已经被下载下来了,代码如下:

  UIFont* aFont = [UIFont fontWithName:fontName size:12.];
    if (aFont && ([aFont.fontName compare:fontName] == NSOrderedSame || [aFont.familyName compare:fontName] == NSOrderedSame)) {
        NSUInteger sampleIndex = [_fontNames indexOfObject:fontName];
        _fTextView.text = [_fontSamples objectAtIndex:sampleIndex];
        _fTextView.font = [UIFont fontWithName:fontName size:24.];
        return;
    }

2.如果字体已经下载过,则可以直接使用。如果没有下载过,需要准备从API下载字体所需要的参数。

//    用将要下载的字体的PostScript名字创建一个字典
    NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithObjectsAndKeys:fontName, kCTFontNameAttribute, nil];

//   为要下载的字体创建一个描述对象 CTFontDescriptorRef
    CTFontDescriptorRef desc = CTFontDescriptorCreateWithAttributes((__bridge CFDictionaryRef)attrs);

    NSMutableArray *descs = [NSMutableArray arrayWithCapacity:0];
//    将描述对象添加到数组中去
    [descs addObject:(__bridge id)desc];

    CFRelease(desc);

3.进行字体的下载,代码如下所示:

__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) {
            dispatch_async( dispatch_get_main_queue(), ^ {
                NSLog(@"下载进度:%@",fontName);
            });
        } else if (state == kCTFontDescriptorMatchingDidFinish) {
            dispatch_async( dispatch_get_main_queue(), ^ {            
//                下载完成,在此处修改UI控件的字体                
                if (!errorDuringDownload) {
                    NSLog(@"%@ 下载完毕", fontName);
                }
            });

        } else if (state == kCTFontDescriptorMatchingWillBeginDownloading)
        {
            dispatch_async( dispatch_get_main_queue(), ^ {
                NSLog(@"开始下载");
            });
        } else if (state == kCTFontDescriptorMatchingDidFinishDownloading)
        {
            dispatch_async( dispatch_get_main_queue(), ^ {
                NSLog(@"正在下载");
            });
        } else if (state == kCTFontDescriptorMatchingDownloading) {
            dispatch_async( dispatch_get_main_queue(), ^ {
//               下载的进度
                NSLog(@"下载进度 %.0f%% complete", 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;

            dispatch_async( dispatch_get_main_queue(), ^ {
                NSLog(@"下载错误: %@", _errorMessage);
            });
        }
        return (bool)YES;
    });

在demo中下载了多种字体,点击显示不同的效果,如下所示:
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值