前提,设计师喜欢使用iOS系统原先没有的字体类型来设计项目中的文字文案。把需要的otf和ttf的字体文件导入的项目中直接使用,网上也有很多例子,但是动不动一个字体文件就要10MB以上,显得包体在应用商场的大小会大了不少。可以打开项目后再进行下载(行不知鬼不觉,哈哈哈)。
使用的第三方库是AFNetworking、SSZipArchive。
JZFontStyleHelper.h文件
#import <Foundation/Foundation.h>
#import <AFNetworking/AFNetworking.h>
#import <CoreText/CoreText.h>
#import "SSZipArchive.h"
NS_ASSUME_NONNULL_BEGIN
@interface JZFontStyleHelper : NSObject
// 下载完成回调
@property (nonatomic , strong) void (^downloadFinishBlock)(NSString *path);
// 解压完成回调
@property (nonatomic , strong) void (^matchFinishBlock)(void);
// 根据链接下载Zip包
- (void)downloadUrlFontWithUrl:(NSString *)fontUrl;
// 获取下载后的文件名
- (NSString *)getCustomFontName;
@end
NS_ASSUME_NONNULL_END
JZFontStyleHelper.m文件
@implementation JZFontStyleHelper
- (void)downloadUrlFontWithUrl:(NSString *)fontUrl {
if ([self checkUrlFontIsDownload]) {
return;
}
// 下载字体文件
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURL *URL = [NSURL URLWithString:fontUrl];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
//NSDocumentDirectory
//NSLibraryDirectory
//用上述两个其中一个均可
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSLibraryDirectory
inDomain:NSUserDomainMask
appropriateForURL:nil
create:NO
error:nil];
return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
NSString * createFilePath = [filePath path];
NSLog(@"下载后的地址-%@",createFilePath);
if (self.downloadFinishBlock) {
self.downloadFinishBlock(createFilePath);
}
//下载完后是zip包,要解压
[self uSSZipArchiveWithFilePath:createFilePath];
}];
[downloadTask resume];
}
/**
SSZipArchive解压
@param path 压缩包文件路径
*/
-(void)uSSZipArchiveWithFilePath:(NSString *)path
{
// Caches路径
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
// 解压目标路径(自定义)
NSString *destinationPath =[cachesPath stringByAppendingPathComponent:@"JZFontStyle"];
// 解压
BOOL isSuccess = [SSZipArchive unzipFileAtPath:path toDestination:destinationPath];
// 如果解压成功则获取解压后文件列表
if (isSuccess) {
[self obtainZipSubsetWithFilePath:destinationPath];
//解压完后把zip文件包删除掉
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL isDelete = [fileManager removeItemAtPath:path error:nil];
NSLog(@"%@",isDelete ? @"删除成功" : @"删除失败");
if (self.matchFinishBlock) {
self.matchFinishBlock();
}
}
}
/**
获取解压后文件列表
@param path 解压后的文件路径
*/
- (void)obtainZipSubsetWithFilePath:(NSString *)path
{
NSString * destinationPath = path;
// 读取文件夹内容
NSError * error = nil;
NSMutableArray * items = [[[NSFileManager defaultManager]
contentsOfDirectoryAtPath:destinationPath
error:&error] mutableCopy];
if (error) {
NSLog(@"error:%@",error.description);
return;
}
// 解压成功后该文件夹下的文件
for (NSString * item_str in items) {
NSLog(@"文件名:%@",item_str);
}
}
// 判断字体文件是否下载了
- (BOOL)checkUrlFontIsDownload {
// Caches路径
NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
// 解压目标路径(自定义)
NSString * filePath = [path stringByAppendingPathComponent:@"JZFontStyle"];
// 读取文件夹内容
NSError * error = nil;
NSMutableArray * items = [[[NSFileManager defaultManager]
contentsOfDirectoryAtPath:filePath
error:&error] mutableCopy];
// 注册字体
for (NSString * item_str in items) {
NSString * destinationPath = [filePath stringByAppendingPathComponent:item_str];
NSString * fontName = [self registerCustomFontWithPath:destinationPath];
NSLog(@"%@",fontName);
}
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:filePath] && items.count > 0) {
return YES;
} else {
return NO;
}
}
// 根据下载解压后的路径来注册字体
- (NSString *)registerCustomFontWithPath:(NSString*)path {
NSURL *fontUrl = [NSURL fileURLWithPath:path];
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithURL((__bridge CFURLRef)fontUrl);
CGFontRef fontRef = CGFontCreateWithDataProvider(fontDataProvider);
CGDataProviderRelease(fontDataProvider);
// 在字体管理器中注册指定的图形字体。要注册才能使用下载的字体
CTFontManagerRegisterGraphicsFont(fontRef, NULL);
NSString *fontName = CFBridgingRelease(CGFontCopyPostScriptName(fontRef));
CGFontRelease(fontRef);
return fontName;
}
- (NSString *)getCustomFontName {
// Caches路径
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
// 解压目标路径
NSString *fontStylePath =[cachesPath stringByAppendingPathComponent:@"JZFontStyle"];
// 读取文件夹内容
NSError *error = nil;
NSMutableArray*items = [[[NSFileManager defaultManager]
contentsOfDirectoryAtPath:fontStylePath
error:&error] mutableCopy];
if (items.count == 0) return @"";
// 获取文件夹下第一个字体文件
NSString * fontName_str = items.firstObject;
NSString *destinationPath =[fontStylePath stringByAppendingPathComponent:fontName_str];
NSString * fontName = [self registerCustomFontWithPath:destinationPath];
return fontName;
}
@end
下载和使用
- (void)viewDidLoad {
[super viewDidLoad];
JZFontStyleHelper * fontStyleHelper = [[JZFontStyleHelper alloc] init];
NSString * fontUrl = @"";//字体文件下载链接
[fontStyleHelper downloadUrlFontWithUrl:fontUrl];
/**
https://xxx/font_style1.zip
我下载有两个字体
文件名:SourceHanSerifCN-Bold.otf
文件名:SourceHanSerifCN-Heavy.otf
*/
// 知道文件名直接使用
self.label.font = [UIFont fontWithName:@"SourceHanSerifCN-Bold" size:24];
// 也可以解压后使用
__weak typeof (self) weakSelf = self;
[fontStyleHelper setMatchFinishBlock:^{
weakSelf.label.font = [UIFont fontWithName:@"SourceHanSerifCN-Bold" size:24];
}];
// 可以获取解压后文件地址的字体
NSString * fontName = [fontStyleHelper getCustomFontName];
self.label.font = [UIFont fontWithName:fontName size:24];
}
- (UILabel *)label{
if (!_label) {
_label = [[UILabel alloc] init];
_label.textColor = UIColor.blackColor;
_label.text = @"自定义字体";
_label.frame = CGRectMake(100, 100, 200, 100);
[self.view addSubview:_label];
}
return _label;
}
直接下载.otf或者.ttf文件也可以,少了解压步骤,在这里就不诉述了,大同小异。
参考资料:
IOS下载在线字体和系统字体
iOS解压ZIP压缩包
网友评论