1、基于Runtime运行时机制的交换方法实现,首先在工程中新建一个Category继承于UILabel命名为FontCategory,如下:
2、在新建类UILabel+FontCategory.m中导入#import <objc/runtime.h>头文件,此头文件是Runtime框架的载体,如下:
3、在UILabel+FontCategory.m中实现+ (void)load;方法,load方法是在main函数调用之前被OC运行时所调用的钩子方法,同时最重要的一点是每个类的load方法都只会调用一次,所以我们在load方法里面实现具体的方法交换,具体实现如下:
4、具体的自定义交换方法实现如下,在交换方法里面实现font的更改,字体名称使用指定的字体库中的即可,如下:
5、通常我们在使用过程中可能会出现某个label的文本不需要更改字体的情况,这个时候需要我们对此进行特殊处理,使用Tag标识的方法来进行判断然后处理,例如我们可以将不需要更改的label文本的tag设置为10000,在使用运行时交换时遇此tag不进行字体更改,具体实现如下:
6、具体测试示例如下,创建label1设置某种字体,定义label2也设置为某种字体,但是设置tag为我们指定的10000,事实在运行之后label1的字体会更改为我们UILabel+FontCategory.m中更改的字体,而label2字体不会变化。