在开发中难免会遇到各种各样的需求, 刚刚实现了一个需求, 所以即使整理下, 希望遇到同样问题的同学少走弯路! 好了言归正传, 今天主要总结一下第三方字体的使用!
首先要从第三方找到字体库文件. 经过我的实践iOS系统是可以支持.ttf格式的字体库的, 因此只需要下载产品需要的字体库就OK了, 具体下载过程不再赘述, 相信你能找到这篇文章, 一定也能找到下载的地方, 我这里下载了一个隶书作为示例!
创建一个FontTest项目, 然后将刚刚下载的字体文件导入到项目中.
-
这一步很重要如果没有这一步, 系统是无法读取到字体文件的, 如下图, 打开当前项目的Info.plist文件, 增加一个Fonts provided by application项目并展开添加你的字体文件名到item0对应的值上, 如果你有多个字体文件, 那么你就多建几个item一一对应上你的文件名即可.
接下来就是字体使用了, 以前设置字体一般都是使用 systemFontOfSize:这个方法, 现在只需要使用fontWithName:size: 如下代码:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self test];
}
- (void)test {
self.testLabel.text = @"我是隶书, 我是隶书";
self.testLabel.font = [UIFont fontWithName:@"LiSu" size:15];
}
-
运行结果如下图2:
OK大工搞成, 是不是觉得很简单, 其实里面还有很多细节要处理.
细节:
我如何获取字体名称, 大家看到我上面直接使用的是LiSu, 但是这个名称又是从哪里来的呢? 哈哈, 这是个关键, 下面说两种方法先说用代码实现:
- 第一种方法: 思路就是 在字体库导入之前打印一下系统的字体库, 然后导入自己的字体库, 通过对比找出你安装的字体名称, 虽然笨但是也可以实现, 代码如下:
NSArray *fontFamilys = [UIFont familyNames];
for (NSString *familyName in fontFamilys) {
NSLog(@"family name : %@",familyName);
NSArray *fontNames = [UIFont fontNamesForFamilyName:familyName];
for (NSString *fontName in fontNames) {
NSLog(@"font name : %@",fontName);
}
}
对比两次打印结果即可找出字体名称;,
- 第二种方法: 直接在mac 上双击字体文件, 系统会弹出一个安装框, 安装之后即可查看字体名称了, so easy !
最后在说一点比较重要的东西, 就是有可能你的项目已经是老项目, 或者已经开发完成的项目, 这个时候如果产品要求全部更换字体, 瞬间你是不是要崩溃了, 擦, 这么多设置字体的地方我的改到猴年马月呀! 哈哈, 既然有这个问题那么不妨就说说这个问题的解决方案吧! 也是目前我认为最好的解决方案, 那就是利用运行时(runtime
)的交换方法, 当然如果你有时间挨个替换最好是替换, 因为苹果不希望开发者使用太多运行时的东西!
首先创建一个UIfont的分类 ,姑且叫fontChangeName吧! 代码如下:
+ (void)load{
[super load];
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method oldMethod = class_getClassMethod([self class], @selector(systemFontOfSize:));
Method newMethod = class_getClassMethod([self class], @selector(jl_changeNameFontOfSize:));
Method oldMethod1 = class_getClassMethod([self class], @selector(boldSystemFontOfSize:));
Method newMethod2 = class_getClassMethod([self class], @selector(jl_changeNameBoldFontOfSize:));
method_exchangeImplementations(oldMethod, newMethod);
method_exchangeImplementations(oldMethod1, newMethod2);
});
}
+ (UIFont *)jl_changeNameFontOfSize:(CGFloat)fontSize{
UIFont *font = [UIFont fontWithName:@"LiSu" size:fontSize];
if (!font)return [self jl_changeNameFontOfSize:fontSize];
return font;
}
+ (UIFont *)jl_changeNameBoldFontOfSize:(CGFloat)fontSize{
UIFont *font = [UIFont fontWithName:@"LiSu" size:fontSize];
if (!font)return [self jl_changeNameBoldFontOfSize:fontSize];
return font;
}
在load方法中去交换系统方法和自己的方法, 这样在调用系统的方法时就会调用自己写的方法, 这样就把字体
的名称全部修改了.
那么肯定还有有人提出问题, 有些字体我不想修改怎么办呢? 其实好办, 只需要将自己写的方法, 在分类的头文件中声明一下, 在想使用系统方法的地方直接调用即可! 因为直接调用你自己的方法就相当于调用系统的方法了! 写到这字体部分基本完成, 如果在使用过程中还有问题, 请@我, 大家一起学习交流!
我是----------Coding--------------Life------------Running--------------底线