iOS中利用 runtime 一键改变字体
2016-05-05 17:32
429 查看
1、准备
我们新建一个项目名叫ChangeFont,然后我就随便找了个名叫loveway.ttf的字体库拖进去,里面的工程目录大概就是这样的
![](http://cc.cocimg.com/api/uploads/20160504/1462332076309853.jpg)
目录
现在我们就简单的直接在storyboard上拖了一个label一个button,约束好,像这样
![](http://cc.cocimg.com/api/uploads/20160504/1462332105604126.jpg)
storyboard
嗯,就这样,很简单,运行
![](http://cc.cocimg.com/api/uploads/20160504/1462332136250481.jpg)
运行结果
好的显示正常,没什么问题,接下来改变字体。
2、改变字体
我们之前已经把loveway.ttf这个文件拖进去了,现在在plist文件里面配置一下。打开plist然后加入名为Fonts provided by application的一行,在item里把我们的字体名字加进去
![](http://cc.cocimg.com/api/uploads/20160504/1462333300523210.jpg)
plist
最后我们需要保证我们确确实实是加进来了
![](http://cc.cocimg.com/api/uploads/20160504/1462333323917497.jpg)
phases
这个时候也许你已经迫不及待了,赶紧改字体,如下
运行。。。oh no !怎么没变,还是原来的样子?!
肯定是姿势不对,于是百度了一下(虽然我一般都用谷歌),的确这种方法不对。
于是改变思路,先找出字体的名字,Like this,代码改成这样
运行一看控制台
![](http://cc.cocimg.com/api/uploads/20160504/1462333535847237.jpg)
输出的字体名称部分截图
这什么鬼,我哪知道我刚加进去的字体名称是什么,这咋找
于是想出来个办法,再建一个工程,不加入loveway.ttf这个字体,打印出来,一个个对比,多的那个不就是了吗!bingo,于是花了一会功夫终于找出来了,是FZLBJW--GB1-0,不管了,先试试看行不行
运行,结果如下
![](http://cc.cocimg.com/api/uploads/20160504/1462333628320683.png)
改变字体后的运行结果
OK!达到效果了,虽然有点挫,但是效果达到了,还不错。
到这里,基本的改变字体效果已达到。
3、查找字体的一种简单的方法
在上面我们可以看到,通过对比的方法找到了FZLBJW--GB1-0这个名字,这里,有一种简单的方法,我们在 Finder 里面找到这个ttf,双击打开(在Xcode里面双击打开没效果),这时候系统就会用苹果自带的字体册打开,如下:
![](http://cc.cocimg.com/api/uploads/20160504/1462333680520284.jpg)
使用字体册打开.rtf
这样我们就可以看到了这个字体的族科名字,我们看到的是FZLiBian-S02S,于是我们在刚才输出全部字体名的控制台搜索一下这个族科名,就可以知道具体的字体名了
![](http://cc.cocimg.com/api/uploads/20160504/1462333708810193.jpg)
搜索FZLiBian-S02S
这样就比上面简单多了。
4、进一步的思考
上面例子中简单的说了一下改变字体的方法,虽然成功了,但是我们不得不思考一下。上面只是两个简单的控件,那么我要是有一堆控件怎么办?或者你可以说我也可用这种方法一个个加,你要是纯代码写的还好,你要是xib写的,难道还要把一个个无用的只是显示一下的label或者button拉出来这样写吗?这样的话,效率肯定会非常低,尤其是那些写到一半的大工程,感觉这种方法肯定是行不通的。
这里利用runtime的class_addMethod、class_replaceMethod、method_exchangeImplementations这几个方法,然后根据+ (void)load这个方法的特性实现(关于+ (void)load这个方法后面会说,或者不懂得童鞋可以先查查资料),代码如下
然后不加任何代码如下
运行
![](http://cc.cocimg.com/api/uploads/20160504/1462338160158851.png)
我们可以看到字体改变了。
如果有人说我有的想改变字体有的不想改变字体怎么办,我这里有个简单的办法就是设置tag,比如我设置label的tag为10086(随便起的),就让他字体不改变
![](http://cc.cocimg.com/api/uploads/20160504/1462338192307160.png)
运行结果
![](http://cc.cocimg.com/api/uploads/20160504/1462338185198299.png)
注意:
1、如果你是代码写控件,你不想改变字体,你只需在创建的时候设置tag为10086
2、上面代码中注释了一行
这个是当时写的时候不改变button的title字体设置的,在这里你可以判断那种类型的改哪种不改,比如说你不想改button的字体,把这一句解注释即可
3、如果你是xib拉的控件,你不想改变字体,你必须在xib界面设置tag为10086,不可加载完毕后在- (void)viewDidLoad里面设置,这还是因为+ (void)load这个方法
在一个程序(main函数)运行之前,所用到的库被加载到runtime之后,被添加到的runtime系统的各种类和category的+load方法就被调用;(关于这点很容易通过打印语句来验证);
如果父类和子类的+load方法都被调用,父类的调用一定在子类之前,这是系统自动完成的,子类+load中没必要显式调用[super load];;
这里只是简单的说一下,具体不理解的可以翻翻官方文档
5、最后
关于代码的解释,在工程里都已经注释的非常清楚了,这里就不多说了,不清楚的童鞋可以给我留言。具体用法很简单,你只需要将UILabel+FontChange.h和UILabel+FontChange.m拉进你的工程即可。
需要下载更多字体的可以在字体库下载,所有的代码都可以在这里下载。
我们新建一个项目名叫ChangeFont,然后我就随便找了个名叫loveway.ttf的字体库拖进去,里面的工程目录大概就是这样的
![](http://cc.cocimg.com/api/uploads/20160504/1462332076309853.jpg)
目录
现在我们就简单的直接在storyboard上拖了一个label一个button,约束好,像这样
![](http://cc.cocimg.com/api/uploads/20160504/1462332105604126.jpg)
storyboard
嗯,就这样,很简单,运行
![](http://cc.cocimg.com/api/uploads/20160504/1462332136250481.jpg)
运行结果
好的显示正常,没什么问题,接下来改变字体。
2、改变字体
我们之前已经把loveway.ttf这个文件拖进去了,现在在plist文件里面配置一下。打开plist然后加入名为Fonts provided by application的一行,在item里把我们的字体名字加进去
![](http://cc.cocimg.com/api/uploads/20160504/1462333300523210.jpg)
plist
最后我们需要保证我们确确实实是加进来了
![](http://cc.cocimg.com/api/uploads/20160504/1462333323917497.jpg)
phases
这个时候也许你已经迫不及待了,赶紧改字体,如下
肯定是姿势不对,于是百度了一下(虽然我一般都用谷歌),的确这种方法不对。
于是改变思路,先找出字体的名字,Like this,代码改成这样
![](http://cc.cocimg.com/api/uploads/20160504/1462333535847237.jpg)
输出的字体名称部分截图
这什么鬼,我哪知道我刚加进去的字体名称是什么,这咋找
于是想出来个办法,再建一个工程,不加入loveway.ttf这个字体,打印出来,一个个对比,多的那个不就是了吗!bingo,于是花了一会功夫终于找出来了,是FZLBJW--GB1-0,不管了,先试试看行不行
![](http://cc.cocimg.com/api/uploads/20160504/1462333628320683.png)
改变字体后的运行结果
OK!达到效果了,虽然有点挫,但是效果达到了,还不错。
到这里,基本的改变字体效果已达到。
3、查找字体的一种简单的方法
在上面我们可以看到,通过对比的方法找到了FZLBJW--GB1-0这个名字,这里,有一种简单的方法,我们在 Finder 里面找到这个ttf,双击打开(在Xcode里面双击打开没效果),这时候系统就会用苹果自带的字体册打开,如下:
![](http://cc.cocimg.com/api/uploads/20160504/1462333680520284.jpg)
使用字体册打开.rtf
这样我们就可以看到了这个字体的族科名字,我们看到的是FZLiBian-S02S,于是我们在刚才输出全部字体名的控制台搜索一下这个族科名,就可以知道具体的字体名了
![](http://cc.cocimg.com/api/uploads/20160504/1462333708810193.jpg)
搜索FZLiBian-S02S
这样就比上面简单多了。
4、进一步的思考
上面例子中简单的说了一下改变字体的方法,虽然成功了,但是我们不得不思考一下。上面只是两个简单的控件,那么我要是有一堆控件怎么办?或者你可以说我也可用这种方法一个个加,你要是纯代码写的还好,你要是xib写的,难道还要把一个个无用的只是显示一下的label或者button拉出来这样写吗?这样的话,效率肯定会非常低,尤其是那些写到一半的大工程,感觉这种方法肯定是行不通的。
这里利用runtime的class_addMethod、class_replaceMethod、method_exchangeImplementations这几个方法,然后根据+ (void)load这个方法的特性实现(关于+ (void)load这个方法后面会说,或者不懂得童鞋可以先查查资料),代码如下
![](http://cc.cocimg.com/api/uploads/20160504/1462338160158851.png)
我们可以看到字体改变了。
如果有人说我有的想改变字体有的不想改变字体怎么办,我这里有个简单的办法就是设置tag,比如我设置label的tag为10086(随便起的),就让他字体不改变
![](http://cc.cocimg.com/api/uploads/20160504/1462338192307160.png)
运行结果
![](http://cc.cocimg.com/api/uploads/20160504/1462338185198299.png)
注意:
1、如果你是代码写控件,你不想改变字体,你只需在创建的时候设置tag为10086
2、上面代码中注释了一行
3、如果你是xib拉的控件,你不想改变字体,你必须在xib界面设置tag为10086,不可加载完毕后在- (void)viewDidLoad里面设置,这还是因为+ (void)load这个方法
在一个程序(main函数)运行之前,所用到的库被加载到runtime之后,被添加到的runtime系统的各种类和category的+load方法就被调用;(关于这点很容易通过打印语句来验证);
如果父类和子类的+load方法都被调用,父类的调用一定在子类之前,这是系统自动完成的,子类+load中没必要显式调用[super load];;
这里只是简单的说一下,具体不理解的可以翻翻官方文档
5、最后
关于代码的解释,在工程里都已经注释的非常清楚了,这里就不多说了,不清楚的童鞋可以给我留言。具体用法很简单,你只需要将UILabel+FontChange.h和UILabel+FontChange.m拉进你的工程即可。
需要下载更多字体的可以在字体库下载,所有的代码都可以在这里下载。
相关文章推荐
- iOS 在价格数字中插入分隔符,逗号,点之类的方法和代码
- iOS指定位置拉扯图片
- iOS字符串替换,字符插入,字符删除
- iOS开发动画(Animation)图片360度不停旋转
- iOS的枚举
- iOS中atomic 与 nonatomic,assign,copy与retain的定义和区别
- iOS获取当前年、月、日等信息
- tableView的系统删除和点击删除
- IOS 杂笔-19(属性与变量的优缺点)
- iOS 搜索功能的实现
- IOS 警告 汇总
- iOS 清除缓存功能详细代码 可过滤特不删除特殊格式文件
- iOS 连个应用之间的跳转
- iOS ViewController点击空白处收起键盘
- iOS 统计代码行数
- iOS - 支付宝支付详解
- iOS 开发中 Duplicate interface definition for class'*'
- iOS 多线程--1
- iOS 设置Label的行间距
- iOS 同一个View识别单击和双击手势