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 ...
随机推荐
- Visual Studio 2015正式发布
Windows 10 RTM正式版要7月29日发布,微软的另一个重磅软件Visual Studio 2015已经率先发布,今天如期放出了正式版本.Visual Studio 2015包括许多新功能和更 ...
- 用lucene替代mysql读库的尝试
采用lucene对mysql中的表建索引,并替代全文检索操作. 备注:代码临时梳理很粗糙,后续修改. import java.io.File; import java.io.IOException; ...
- Spark 生态系统组件
摘要: 随着大数据技术的发展,实时流计算.机器学习.图计算等领域成为较热的研究方向,而Spark作为大数据处理的“利器”有着较为成熟的生态圈,能够一站式解决类似场景的问题.那你知道Spark生态系统有 ...
- ASP.NET OAuth:access token的加密解密,client secret与refresh token的生成
在 ASP.NET OWIN OAuth(Microsoft.Owin.Security.OAuth)中,access token 的默认加密方法是: 1) System.Security.Crypt ...
- Apply Newton Method to Find Extrema in OPEN CASCADE
Apply Newton Method to Find Extrema in OPEN CASCADE eryar@163.com Abstract. In calculus, Newton’s me ...
- css3 transition animation nick
时光转眼即逝,又到周六了,今天写点某部分人看不起的css玩玩! 转换 转换属性transform: 浏览器前缀: -webkit-transform;-o-transform;-moz-transfo ...
- Centos 上 Tengine安装
安装步骤: 1.系统环境 1.1 更新系统 [root@centos ~]# yum update -y 1.2 查看环境 [root@centos ~]# cat /etc/redhat-relea ...
- (转)从P1到P7——我在淘宝这7年
(一) 2011-12-08 [原文链接] 今天有同事恭喜我,我才知道自己在淘宝已经七周年了.很多人第一句话就是七年痒不痒,老实说,也曾经痒过,但往往都是一痒而过,又投入到水深火热的工作中去.回家之后 ...
- 如果你也会C#,那不妨了解下F#(3):F#集合类型和其他核心类型
本文链接:http://www.cnblogs.com/hjklin/p/fs-for-cs-dev-3.html 在第一篇中,我们介绍了一些基础数据类型,其实那篇标题中不应该含有"F#&q ...
- SQL Server 2012 清理日志 截断日志的方法
MEDIA数据库名 ALTER DATABASE MEDIA SET RECOVERY SIMPLE WITH NO_WAIT ALTER DATABASE MEDIA SET RECOVERY SI ...