iOS字体加载三种方式
这是一篇很简短的文章,介绍了 iOS 自定义字体加载的三种方式。

静态加载
这个可以说是最简单最直观的一种加载自定义字体的方式。只要字体包含到工程中,然后修改工程的 plist 文件,添加 Fonts provided by application 字段,并把要添加的字体文件名写入这个数组。

之后直接使用即可
- (void)staticLoad
{
self.staticFontLabel.font = [UIFont fontWithName:@"MFYingHua_Noncommercial-Regular" size:50];
}
动态加载
有时我们不希望把字体包含到 bundle 中静态加载,比如字体提供商对字体进行了加密,需要在程序运行时解密。又或者希望能通过后端控制 App 的显示字体。那么我们就需要动态加载字体。
- (void)dynamicLoad
{
//字体文件所在路径
NSString *URL_FONT = @"http://192.168.1.12:8888/static/MFDingDing.otf"; //字体名
NSString *fontName = @"MFDingDing_Noncommercial-Regular"; //下载字体
NSData *dynamicFontData = [NSData dataWithContentsOfURL:[NSURL URLWithString:URL_FONT]];
if (!dynamicFontData)
return;
CFErrorRef error;
CGDataProviderRef providerRef = CGDataProviderCreateWithCFData((CFDataRef)dynamicFontData);
CGFontRef font = CGFontCreateWithDataProvider(providerRef);
if (! CTFontManagerRegisterGraphicsFont(font, &error))
{
//如果注册失败,则不使用
CFStringRef errorDescription = CFErrorCopyDescription(error);
NSLog(@"Failed to load font: %@", errorDescription);
CFRelease(errorDescription);
}
else
self.dynamicFontLabel.font = [UIFont fontWithName:fontName size:50];
CFRelease(font);
CFRelease(providerRef);
}
注意,你需要添加 CoreText.framework 并包含头文件 #import <CoreText/CoreText.h>。
动态下载苹果提供的多种字体
从 iOS 6 开始,苹果提供了一个新的 API 可以让我们动态下载苹果提供的额外字体。并且,这些字体是下载到系统中,也就是说,如果其他 App 也使用了这个字体或者 App 删除后重装时是无需再额外下载这个字体的。
在这里推荐一篇来自唐巧的博文:动态下载苹果提供的多种中文字体,作者很详细的介绍了这个功能。所以这里就不再重复叙述了。
其他
最后提供俩小函数
打印出当前所有可用的字体
- (void)printAllFonts
{
NSArray *fontFamilies = [UIFont familyNames]; for (NSString *fontFamily in fontFamilies)
{
NSArray *fontNames = [UIFont fontNamesForFamilyName:fontFamily];
NSLog (@"%@: %@", fontFamily, fontNames);
}
}
检查某字体是否已经下载
- (BOOL)isFontDownloaded:(NSString *)fontName
{
UIFont* aFont = [UIFont fontWithName:fontName size:12.0]; BOOL isDownloaded = (aFont && ([aFont.fontName compare:fontName] == NSOrderedSame
|| [aFont.familyName compare:fontName] == NSOrderedSame));
return isDownloaded;
}
iOS字体加载三种方式的更多相关文章
- vue+element ui项目总结点(一)select、Cascader级联选择器、encodeURI、decodeURI转码解码、mockjs用法、路由懒加载三种方式
不多说上代码: <template> <div class="hello"> <h1>{{ msg }}</h1> <p> ...
- js异步执行 按需加载 三种方式
js异步执行 按需加载 三种方式 第一种:函数引用 将所需加载方法放在匿名函数中传入 //第一种 函数引用 function loadScript(url,callback){ //创建一个js va ...
- entity framework 数据加载三种方式的异同(延迟加载,预加载,显示加载)
三种加载方式的区别 显示加载: 显示加载
- iOS拨打电话的三种方式
iOS拨打电话的三种方式 1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示 1 2 var string = "tel:" + "1 ...
- iOS:延时执行的三种方式
延时执行的三种方式:performSelectorXXX方法.GCD中延时函数.创建定时器 第一种方式:NSObject分类当中的方法,延迟一段时间调用某一个方法 @interface NSObj ...
- flask配置加载几种方式
方法一.直接配置 app.config['HOST']='xxx.a.com' print(app.config.get('HOST')) 方法二.通过环境变量加载配置 环境变量:export MyA ...
- Flask的配置文件加载两种方式
配置文件 1 基于全局变量 2 基于类的方式 配置文件的加载需要将配合文件的相对路径添加到app.config.from_object("文件路径"),类的方式也是一样,需要将类的 ...
- iOS设置圆角的三种方式
第一种方法:通过设置layer的属性 最简单的一种,但是很影响性能,一般在正常的开发中使用很少. ? 1 2 3 4 5 6 7 UIImageView *imageView = [[UIImageV ...
- Latex中如何设置字体颜色(三种方式)
1.直接使用定义好的颜色 \usepackage{color} \textcolor{red/blue/green/black/white/cyan/magenta/yellow}{text} 其中t ...
随机推荐
- Flume1 初识Flume和虚拟机搭建Flume环境
前言: 工作中需要同步日志到hdfs,以前是找运维用rsync做同步,现在一般是用flume同步数据到hdfs.以前为了工作简单看个flume的一些东西,今天下午有时间自己利用虚拟机搭建了 ...
- ucos实时操作系统学习笔记——任务间通信(互斥锁)
想讲一下ucos任务间通信中的mutex,感觉其设计挺巧妙,同sem一样使用的是event机制实现的,代码不每一行都分析,因为讲的没邵贝贝老师清楚,主要讲一下mutex的内核是如何实现的.可以理解互斥 ...
- Building the Testing Pipeline
This essay is a part of my knowledge sharing session slides which are shared for development and qua ...
- 物联网实验4 alljoyn物联网实验之手机局域网控制设备
AllJoyn开源物联网协议框架,官方描述是一个能够使连接设备之间进行互操作的通用软件框架和系统服务核心集,也是一个跨制造商来创建动态近端网络的软件应用.高通已经将该项目捐赠给了一个名为“AllSee ...
- Sass用法指南
写在前面的话:随着CSS文件越来越大,内容越来越复杂,对其进行很好的维护将变的很困难.这时CSS预处理器就能够帮上大忙了,它们往往拥有变量.嵌套.继承等许多CSS不具备的特性.有很多CSS预处理器,这 ...
- Jmeter安装与环境部署
Jmeter安装与环境部署 版权声明:本文为博主原创文章,未经博主允许不得转载. 博主:海宁 联系:whnsspu@163.com
- 游戏服务器菜鸟之C#初探四游戏服务
经过多次折腾之后,在一次进行了一次重大的重构,去解决问题 主要重构如下 1.将原来的单一协议修改多协议进行,一些查询.认证的功能都采用HTTP进行,避免全部采用TCP链接资源的消耗: 2.原来单一的部 ...
- 在linux平台实现atosl
➠更多技术干货请戳:听云博客 序言 怎么在linux 平台下实现一个类似于mac 平台下的 atos 工具( iOS 符号化解析)? 分析问题 在github上找到了几年前的开源实现,[https:/ ...
- 计算照片的面积(UWP篇)
今天先说UWP应用程序上计算照片面积的方法,改天有空,再说说WPF篇. 其实计算照片面积的原理真TMD简单,只要你有本事读到照片的像素高度和宽度,以及水平/垂直方向上的分辨率(DPI)就可以了.计算方 ...
- C#中的Session
一: 网站开发中,为了保存用户信息我们就会用到session. Session具有以下特点:(1)Session中的数据保存在服务器端:(2)Session中可以保存任意类型的数据:(2)Sessio ...