iOS 使用第三方字体
前言
在iOS的项目开发中经常遇到需要使用一些自定义的字体文件,比如仿宋_GB2312
、华康少女体
等。之前我们为了使用这些自定义的字体,在应用的资源包中放入这些字体文件。因为字体文件通常比较大,有的一个字库就达到10M以上,这样打包后的ipa文件的体积就可能会变得很大,对于只有个别的模块需要特殊的字体样式的应用来说很不划算,那么在iOS6.0以后苹果就开放了动态加载字体的权限。下面就iOS中使用字体的这两种方式进行介绍。
使用静态字体
将字体文件拷贝到项目工程中,在Info.plist
文件中添加Fonts provided by application
的配置项,其中每一个Item对应的是字体文件的名称,如huakangshaonv.ttf
。

然后就可以调用+ (UIFont *)fontWithName:(NSString *)fontName size:(CGFloat)fontSize
使用字体,如果不知道fontName可以遍历打印出来:
- (void)allFont
{
NSArray *fontFamilies = [UIFont familyNames];
for (NSString *fontFamily in fontFamilies)
{
NSArray *fontNames = [UIFont fontNamesForFamilyName:fontFamily];
NSLog (@">>> fontFamily : %@ , fontNames : %@", fontFamily, fontNames);
}
}
使用动态字体
在网易新闻iOS客户端中可以使用自定义的字体,对于未下载的字体可先下载然后安装下次就能自动设置为该字体,效果如下:

下面就该功能简单介绍实现的步骤
- 下载字体文件
- (NSString *)downloadZipFile:(NSString *)fileUrl toPath:(NSString *)path
{
NSError *error = nil;
NSURL *url = [NSURL URLWithString:fileUrl];
NSString *fileName = [url lastPathComponent];
NSData *data = [NSData dataWithContentsOfURL:url options:0 error:&error];
if(!error)
{
NSString *zipPath = [path stringByAppendingPathComponent:fileName];
[data writeToFile:zipPath options:0 error:&error];
if(!error)
{
return zipPath;
}
}
return nil;
}
- 解压zip压缩包
iOS中解压zip压缩文件非常方便,使用ZipArchive这个开源项目按照如下的方式即可快速解压zip文件。
- (NSString *)expandZipFile:(NSString *)src toPath:(NSString *)desc
{
ZipArchive *za = [[ZipArchive alloc] init];
if ([za UnzipOpenFile:src])
{
BOOL ret = [za UnzipFileTo:desc overWrite:YES];//解压文件
if(ret)
{
NSString *zipName = [src lastPathComponent];//获取zip文件的文件名
[[NSFileManager defaultManager] removeItemAtPath:zipPath error:nil];//删除zip压缩包
zipName = [zipName substringToIndex:[zipName rangeOfString:@".zip"].location];//获取解压到的文件夹
return [self.downloadPath stringByAppendingPathComponent:zipName];
}
}
return nil;
}
- 注册指定路径下的字体文件
下载回来的字体文件如果不做处理是不能直接使用的,使用前需要先注册然后才能使用,注册方式如下:
- (void)registerFont:(NSString *)fontPath
{
NSData *dynamicFontData = [NSData dataWithContentsOfFile:fontPath];
if (!dynamicFontData)
{
return;
}
CFErrorRef error;
CGDataProviderRef providerRef = CGDataProviderCreateWithCFData((__bridge CFDataRef)dynamicFontData);
CGFontRef font = CGFontCreateWithDataProvider(providerRef);
if (! CTFontManagerRegisterGraphicsFont(font, &error))
{
//注册失败
CFStringRef errorDescription = CFErrorCopyDescription(error);
NSLog(@"Failed to load font: %@", errorDescription);
CFRelease(errorDescription);
}
CFRelease(font);
CFRelease(providerRef);
}
需要先引入#import <CoreText/CoreText.h>
,CoreText
框架
- 判断字体是否加载
在使用字体文件前最好是先判断字体是否已经被加载过了,判断方式如下:
- (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;
}
- 其他说明
经测试注册过的字体在应用关闭后下次开启应用,判断字体是否加载时返回为NO
,为了保证正常使用需要每次启动应用的时候先遍历一遍字体文件夹将里面的字体文件都再次注册一遍即可。参考代码如下:
//注册fonts目录下面的所有字体文件
NSArray *ary = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:self.downloadPath error:nil];
for (NSString *p1 in ary)
{
NSString *t1 = [self.downloadPath stringByAppendingPathComponent:p1];
NSArray *ary1 = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:t1 error:nil];
for (NSString *p1 in ary1)
{
NSString *t2 = [t1 stringByAppendingPathComponent:p1];
if([t2 rangeOfString:@".ttf"].location != NSNotFound)
{
[self registerFont:t2];
}
}
}
以上就是对使用第三方字体的方法的介绍。
参考
作者:不简单的风度
链接:https://www.jianshu.com/p/a02be724b7ec
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!