程序运行结果如下 :

当点击对应单元格实现下载对应的字体.

控制台打印结果如下 :

2015-10-05 11:14:04.132 UIFontDownLoad[12721:86827] state 0 - {
}
2015-10-05 11:14:04.134 UIFontDownLoad[12721:86827] state 7 - {
    CTFontDescriptorMatchingResult =     (
        "UICTFontDescriptor <0x7fddd05388d0> = {\n    NSFontNameAttribute = Helvetica;\n    NSFontSizeAttribute = 12;\n}"
    );
    CTFontDescriptorMatchingSourceDescriptor = "UICTFontDescriptor <0x7fddd0797a80> = {\n    NSFont = \"STXingkai-SC-Light\";\n}";
}
2015-10-05 11:14:04.134 UIFontDownLoad[12721:86827] state 1 - {
    CTFontDescriptorMatchingResult =     (
        "UICTFontDescriptor <0x7fddd05388d0> = {\n    NSFontNameAttribute = Helvetica;\n    NSFontSizeAttribute = 12;\n}"
    );
}
2015-10-05 11:14:04.147 UIFontDownLoad[12721:85405] 字体已经匹配
2015-10-05 11:14:04.147 UIFontDownLoad[12721:85405] 字体下载完成
2015-10-05 11:14:05.562 UIFontDownLoad[12721:85405] STXingkai-SC-Light downloaded

程序实现的代码如下 :

//
//  ViewController.m
//  UIFontDownLoad
//
//  Created by mac1 on 15/10/5.
//  Copyright (c) 2015年 www.iphonetrain.com. All rights reserved.
//

#import "ViewController.h"

/*
 一种能够对文本格式和文本布局进行精细控制的文本引擎
 */
#import <CoreText/CoreText.h>

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>

@property (nonatomic,strong)NSArray *fontNames;
@property (nonatomic,strong)NSArray *fontSamples;
@property (nonatomic,strong)UITableView *myTableView;

@end

static NSString *identify = @"cell";

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
 
    self.view.backgroundColor = [UIColor greenColor];

[self addData];
    [self creatUI];
    
    
    
}

//初始化界面
- (void)creatUI
{
    _myTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 568)];
    _myTableView.dataSource = self;
    _myTableView.delegate = self;
    [self.view addSubview:_myTableView];
    
    
    /*
     注册单元格
    [_myTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:identify];
     */
    
     
}

//初始化数据

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

}

//行数

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return _fontNames.count;
    
}

//创建单元格

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

//直接显示内容就不注册单元格

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identify];
    if (cell == nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identify];
        
    }
    cell.textLabel.text = _fontNames[indexPath.row];

return cell;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self asynchronouslySetFontName:_fontNames[indexPath.row]];
}

#pragma -mark -functions
//字体开始进行下载

- (void)asynchronouslySetFontName:(NSString *)fontName
{
    UIFont *aFont = [UIFont fontWithName:fontName size:12];
    
    //判断字体是否已经被下载
    if (aFont && ([aFont.fontName compare:fontName] == NSOrderedSame || [aFont.familyName compare:fontName] == NSOrderedSame))
    {
        NSLog(@"字体已经被下载");
        return;
    }

//用字体的PostScript名字创建一个Dictionary
    NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithObjectsAndKeys:fontName,kCTFontAttributeName, nil];
    
    
    // 创建一个字体描述对象CTFontDescriptorRef
    CTFontDescriptorRef desc = CTFontDescriptorCreateWithAttributes((__bridge CFDictionaryRef)attrs);
    
    //将字体描述对象放到一个NSMutableArray中
    NSMutableArray *descs = [NSMutableArray arrayWithCapacity:0];
    [descs addObject:(__bridge id)desc];
    CFRelease(desc);
    
    __block BOOL errorDuringDownload = NO;
    
    //开始对字体进行下载
    CTFontDescriptorMatchFontDescriptorsWithProgressHandler( (__bridge CFArrayRef)descs, NULL,  ^(CTFontDescriptorMatchingState state, CFDictionaryRef progressParameter) {
        
        NSLog( @"state %d - %@", state, progressParameter);
        
        double progressValue = [[(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingPercentage] doubleValue];
        
        
        if (state == kCTFontDescriptorMatchingDidBegin) {
            dispatch_async( dispatch_get_main_queue(), ^ {
                NSLog(@"字体已经匹配");
            });
        } else if (state == kCTFontDescriptorMatchingDidFinish) {
            dispatch_async( dispatch_get_main_queue(), ^ {
                NSLog(@"字体下载完成");
                
                // Log the font URL in the console
                CTFontRef fontRef = CTFontCreateWithName((__bridge CFStringRef)fontName, 0., NULL);
                CFStringRef fontURL = CTFontCopyAttribute(fontRef, kCTFontURLAttribute);
                CFRelease(fontURL);
                CFRelease(fontRef);
                
                if (!errorDuringDownload) {
                    NSLog(@"%@ downloaded", 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(@"下载进度");
            });
        } else if (state == kCTFontDescriptorMatchingDidFailWithError) {
            NSLog(@"下载失败");
            
            NSError *error = [(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingError];
            if (error != nil) {
                NSLog(@"errorMessage--%@-",[error description]);
            } else {
                NSLog(@"error message is not available");
            }
            errorDuringDownload = YES;
            dispatch_async( dispatch_get_main_queue(), ^ {
                NSLog(@"Download error: %@", [error description]);
            });
        }
        
        return (bool)YES;
    });
     
}

UIFontDownLoad ----动态下载系统提供的字体的更多相关文章

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

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

  2. 【读书笔记】iOS-UIFont-动态下载系统提供的字体-官方代码

    一,工程目录 二,AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOption ...

  3. 【读书笔记】iOS-UIFont-动态下载系统提供的多种中文字体网址

    苹果可使用的字体列表: https://support.apple.com/zh-cn/HT202599 动态下载字体的代码demo: https://developer.apple.com/libr ...

  4. OSGI(面向Java的动态模型系统)

    基本简介编辑 OSGI服务平台提供在多种网络设备上无需重启的动态改变构造的功能.为了最小化耦合度和促使这些耦合度可管理,OSGi技术提供一种面向服务的架构,它能使这些组件动态地发现对方.OSGi联 O ...

  5. OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统

    OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统 OSGi 的核心:模块化.动态.基于 OSGi 就可以模块化的开发 java 应用,模块化的部署 java 应用,还可以动态管理 ...

  6. OSGI 面向Java的动态模型系统

    OSGI (面向Java的动态模型系统) OSGi(Open Service Gateway Initiative)技术是Java动态化模块化系统的一系列规范.OSGi一方面指维护OSGi规范的OSG ...

  7. Android该系统提供的服务--Vibrator(振子)

    Android该系统提供的服务--Vibrator(振子) --转载请注明出处:coder-pig Vibrator简单介绍与相关方法: watermark/2/text/aHR0cDovL2Jsb2 ...

  8. (原)SQL Server 系统提供功能的三个疑惑

    本文目录列表: 1.SQL Server系统提供的部分疑惑概述2.系统函数调用时DEFAULT代替可选参数使用不统一3.队列字段列message_enqueue_time记录的是UTC日期时间 4.@ ...

  9. 很简单的在Ubuntu系统下安装字体和切换默认字体的方法

    摘要: Ubuntu系统安装好后,默认字体对于中文的支持看上去不太美丽,于是很多朋友可能需要设置系统的默认字体为自己喜欢的字体.本文主要介绍如何解决这两个问题. 说明:测试系统是Ubuntu14.04 ...

随机推荐

  1. 【CCF CSP】 20171203 行车路线 Java(有问题)80分

    问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果连续走小道,小明的疲劳值会快速增加,连续走s公 ...

  2. 使用druid连接池的超时回收机制排查连接泄露

    起因:系统连接池满了 Exception wait millis 60012, active 2000, maxActive 2000, creating 0 加配置排查: <!-- 超过时间限 ...

  3. 使用Newtonsoft.Json将数据导出至Json文件

    导出方法: /// <summary> /// 导出文件 /// </summary> public void Export(List<Dict> dicts, s ...

  4. css3 2D变形(transform)移动、缩放、旋转、倾斜

    一. translate(x,y) 或者translateX(x)或者translateY(y) 注意点:translateX(x)和translateY(y)大写X和Y:只写一个值,默认y=0. & ...

  5. 【csp模拟赛九】--dfs

    思路: 这道题可以宽搜,深搜,最短路 代码: #include<cstdio> #include<cstring> #include<iostream> #incl ...

  6. codevs 4244 平衡树练习

    二次联通门 : codevs 4244 平衡树练习 Splay实测指针占用空间大约是数组的3倍, 且时间上也慢了差不多1s 数组版评测记录如下 指针版评测记录如下     以上数据仅限这一个题, 对于 ...

  7. 设计一个树型目录结构的文件系统,其根目录为 root,各分支可以是目录,也可以是文件,最后的叶子都是文件。

    设计一个树型目录结构的文件系统,其根目录为 root,各分支可以是目录,也可以是文件,最后的叶子都是文件. 我实现的功能是提供父目录(兄弟目录),输入文件名,创建树型目录结构,文本文件不可以再有子目录 ...

  8. 启动Django项目报错

    今天一时手欠将电脑名字改成了中文,在启动Django或Flask项目的时候一直报下面的错误 问题描述: 环境配置成功,Django成功pip,运行项目报错,浏览器输入127.0.0.1:8000报错 ...

  9. 安装cartographer遇到Unrecognized syntax identifier "proto3". This parser only recognizes "proto2"问题

    https://stackoverflow.com/questions/38605734/mac-cannot-find-eigen3 https://blog.csdn.net/qq_4214518 ...

  10. mysql授权访问数据库

    授权给mysql权限 将所有的权限赋值给某个用户 grant all privileges on *.* to username@"%" identified by 'passwo ...