千家信息网

RunTime的使用-Category改变整个项目全部字体

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,在项目比较成熟的基础上,遇到了这样一个需求,应用中需要引入新的字体,需要更换所有Label的默认字体,但是同时,对于一些特殊设置了字体的label又不需要更换。乍看起来,这个问题确实十分棘手,首先项目
千家信息网最后更新 2026年11月02日RunTime的使用-Category改变整个项目全部字体


在项目比较成熟的基础上,遇到了这样一个需求,应用中需要引入新的字体,需要更换所有Label的默认字体,但是同时,对于一些特殊设置了字体的label又不需要更换。乍看起来,这个问题确实十分棘手,首先项目比较大,一个一个设置所有使用到的label的font工作量是巨大的,并且在许多动态展示的界面中,可能会漏掉一些label,产生bug。其次,项目中的label来源并不唯一,有用代码创建的,有xib和storyBoard中的,这也将浪费很大的精力。这种情况下,我们可能会有下面两种处理方式。

1、使用框架

创建我们自己的BaseLabel类,在其中进行默认字体的设置,并且并不影响在使用过程中特殊设置字体的label,这种方式可以满足我们的需求,但是并不适于我们的场景,项目已经成熟,重建一个label基类,来让所有的UILabel都换成它的工作量不会比重新设置所有label字体的工作量小太多。但这也是有优势的,至少如果下次再换字体,我们就不用麻烦了。

2、使用runtime替换UILabel初始化方法

这是最简单方便的方法,我们可以使用runtime机制替换掉UILabel的初始化方法,在其中对label的字体进行默认设置。因为Label可以从initWithFrame、init和nib文件三个来源初始化,所以我们需要将这三个初始化的方法都替换掉。

首先,我们创建一个UILabel的类别:

#import

@interface UILabel (ChangeDefaultFont)

@end


#import "UILabel+ChangeDefaultFont.h"
#import
@implementation UILabel (ChangeDefaultFont)

/**
*每个NSObject的子类都会调用下面这个方法 在这里将init方法进行替换,使用我们的新字体
*如果在程序中又特殊设置了字体 则特殊设置的字体不会受影响 但是不要在Label的init方法中设置字体
*从init和initWithFrame和nib文件的加载方法 都支持更换默认字体
*/
+(void)load{
//只执行一次这个方法
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
// When swizzling a class method, use the following:
// Class class = object_getClass((id)self);
//替换三个方法
SEL originalSelector = @selector(init);
SEL originalSelector2 = @selector(initWithFrame:);
SEL originalSelector3 = @selector(awakeFromNib);
SEL swizzledSelector = @selector(YHBaseInit);
SEL swizzledSelector2 = @selector(YHBaseInitWithFrame:);
SEL swizzledSelector3 = @selector(YHBaseAwakeFromNib);


Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method originalMethod2 = class_getInstanceMethod(class, originalSelector2);
Method originalMethod3 = class_getInstanceMethod(class, originalSelector3);
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
Method swizzledMethod2 = class_getInstanceMethod(class, swizzledSelector2);
Method swizzledMethod3 = class_getInstanceMethod(class, swizzledSelector3);
BOOL didAddMethod =
class_addMethod(class,
originalSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
BOOL didAddMethod2 =
class_addMethod(class,
originalSelector2,
method_getImplementation(swizzledMethod2),
method_getTypeEncoding(swizzledMethod2));
BOOL didAddMethod3 =
class_addMethod(class,
originalSelector3,
method_getImplementation(swizzledMethod3),
method_getTypeEncoding(swizzledMethod3));

if (didAddMethod) {
class_replaceMethod(class,
swizzledSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));

} else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
if (didAddMethod2) {
class_replaceMethod(class,
swizzledSelector2,
method_getImplementation(originalMethod2),
method_getTypeEncoding(originalMethod2));
}else {
method_exchangeImplementations(originalMethod2, swizzledMethod2);
}
if (didAddMethod3) {
class_replaceMethod(class,
swizzledSelector3,
method_getImplementation(originalMethod3),
method_getTypeEncoding(originalMethod3));
}else {
method_exchangeImplementations(originalMethod3, swizzledMethod3);
}
});

}
/**
*在这些方法中将你的字体名字换进去
*/
- (instancetype)YHBaseInit
{
id __self = [self YHBaseInit];
UIFont * font = [UIFont fontWithName:@"Helvetica-Oblique" size:self.font.pointSize];
if (font) {

if (Main_Screen_Height>540)
{
self.font = [UIFont fontWithName:@"Helvetica-Oblique" size:self.font.pointSize-2];
}
else
{
self.font=font;
}

}
return __self;
}

-(instancetype)YHBaseInitWithFrame:(CGRect)rect{
id __self = [self YHBaseInitWithFrame:rect];
UIFont * font = [UIFont fontWithName:@"Helvetica-Oblique" size:self.font.pointSize];
if (font) {

if (Main_Screen_Height>540)
{
self.font = [UIFont fontWithName:@"Helvetica-Oblique" size:self.font.pointSize-2];
}
else
{
self.font=font;
}
}
return __self;
}
-(void)YHBaseAwakeFromNib{
[self YHBaseAwakeFromNib];
UIFont * font = [UIFont fontWithName:@"Helvetica-Oblique" size:self.font.pointSize];
if (font) {

if (Main_Screen_Height>540)
{
self.font = [UIFont fontWithName:@"Helvetica-Oblique" size:self.font.pointSize-2];
}
else
{
self.font=font;
}

}

}


@end


由于个人项目的原因,我的项目有一定特殊性 在Iphone6 plus 以上的尺寸需要压缩字体所以用了这个方法法 检测屏幕的长度来判断设备型号,从而让字体的大小减小2个字号 达到目的,在实际的需求之中,我们还可以用来更换产品给出的不同的字体以及字号大小


字体 方法 项目 特殊 三个 工作量 需求 工作 成熟 大小 字号 文件 方式 来源 影响 不同 巨大 很大 棘手 不用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技有限公司 哈尔滨大商圈互联网科技有限公司 美国互联网保险保险科技 金诺互联网科技 嘟嘟瓜互联网科技 迪茉互联网科技 华中科技大学互联网 深圳天众互联网科技公司 苏州大垚互联网科技 一五八零互联网科技 四个字互联网科技公司取名 蓝色互联网科技 互联网科技公司需要的职位 晓花互联网科技有限公司网址 互联网与医疗科技 速维有品互联网信息科技(苏州)有限公司 互联网企业科技类企业如何做账 广州有谷有贝互联网科技有限公司 九思连强互联网电子科技有限公司 西安左小互联网科技有限公司 互联网科技名片 互联网科技未来 时间互联网络科技 互联网科技公司介绍 互联网金融和金融科技 互联网科技公司的市场部门 中盈科技互联网信息有限公司 佛山市翊博互联网络科技有限公司 数字科技和互联网金融哪个好 青岛互联网科技园
0