运用Runtime全局修改UILabel的默认字体

今天同事项目遇到一个问题,要修改所有UILabel的字体,我查了以下资料,推荐使用runtime机制替换掉UILabel的初始化方法,对label的字体进行默认设置。主要替换以下三个方法initWithFrame、init和xib用到的awakeFromNib,创建UILabel的类别代码如下:

.h

#import <UIKit/UIKit.h>

@interface UILabel (LabelDefaultFont)

@end

.m

#import "UILabel+LabelDefaultFont.h"
#import <objc/runtime.h>
@implementation UILabel (LabelDefaultFont)

+(void)load{

    static dispatch_once_t t;
    dispatch_once(&t, ^{
        Class class = [self class];
        // When swizzling a class method, use the following:
        //Class class = objc_getClass((id)self);

        //替换三个方法
        SEL selector_init = @selector(init);
        SEL selector_initWithFrame = @selector(initWithFrame:);
        SEL selector_awakeFromeNib = @selector(awakeFromNib);

        SEL selector_lfinit = @selector(LFinit);
        SEL selector_lfinitWithFrame = @selector(LFinitWithFrame:);
        SEL selector_lfawakeFromeNib = @selector(LFawakeFromNib);

        Method method_init = class_getInstanceMethod(class, selector_init);
        Method method_initWithFrame = class_getInstanceMethod(class, selector_initWithFrame);
        Method method_awakeFromeNib = class_getInstanceMethod(class, selector_awakeFromeNib);

        Method method_lfinit = class_getInstanceMethod(class, selector_lfinit);
        Method method_lfinitWithFrame = class_getInstanceMethod(class, selector_lfinitWithFrame);
        Method method_lfawakeFromeNib = class_getInstanceMethod(class, selector_lfawakeFromeNib);

        BOOL didAddMethod_init = class_addMethod(class, selector_init, method_getImplementation(method_lfinit), method_getTypeEncoding(method_lfinit));
        BOOL didAddMethod_initWithFrame = class_addMethod(class, selector_initWithFrame, method_getImplementation(method_lfinitWithFrame), method_getTypeEncoding(method_lfinitWithFrame));
        BOOL didAddMethod_awakeFromeNib = class_addMethod(class, selector_awakeFromeNib, method_getImplementation(method_lfawakeFromeNib), method_getTypeEncoding(method_lfawakeFromeNib));

        if (didAddMethod_init) {
            class_replaceMethod(class, selector_lfinit, method_getImplementation(method_init), method_getTypeEncoding(method_init));
        }else{

            method_exchangeImplementations(method_init, method_lfinit);
        }

        if (didAddMethod_initWithFrame) {
            class_replaceMethod(class, selector_lfinitWithFrame, method_getImplementation(method_initWithFrame), method_getTypeEncoding(method_initWithFrame));
        }else{

            method_exchangeImplementations(method_initWithFrame, method_lfinitWithFrame);
        }

        if (didAddMethod_awakeFromeNib) {
            class_replaceMethod(class, selector_lfawakeFromeNib, method_getImplementation(method_awakeFromeNib), method_getTypeEncoding(method_awakeFromeNib));
        }else{

            method_exchangeImplementations(method_awakeFromeNib, method_lfawakeFromeNib);
        }

    });

}
#pragma mark - 在以下方法中更换字体
-(instancetype)LFinit{
    id _self = [self LFinit];
    UIFont *font = [UIFont fontWithName:@"Copperplate-Bold" size:self.font.pointSize];
    if (font) {
        self.font = font;
    }
    return _self;

}
-(instancetype)LFinitWithFrame:(CGRect)frame{
    id _self = [self LFinitWithFrame:frame];
    UIFont *font = [UIFont fontWithName:@"Copperplate-Bold" size:self.font.pointSize];
    if (font) {
        self.font = font;
    }
    return _self;
}

-(void)LFawakeFromNib{
    [self LFawakeFromNib];
    UIFont *font = [UIFont fontWithName:@"Copperplate-Bold" size:self.font.pointSize];
    if (font) {
        self.font = font;
    }

}

@end

测试代码:

   UILabel *label1 = [[UILabel alloc]initWithFrame:CGRectMake(10, 180 + 20, 300, 30)];
//    label1.font = [UIFont fontWithName:@"Copperplate-Bold" size:17];
    label1.text = @"我是initwithframe创建的label1";
    [self.view addSubview:label1];

    UILabel *label2 = [[UILabel alloc]init];
    label2.frame = CGRectMake(10, CGRectGetMaxY(label1.frame) + 20, 300, 30);
    label2.text = @"我是init创建的label2";
    [self.view addSubview:label2];

    UILabel *label3 = [[UILabel alloc]init];
    label3.frame = CGRectMake(10, CGRectGetMaxY(label2.frame) + 20, 300, 30);
    label3.font = [UIFont systemFontOfSize:17];
    label3.text = @"我是init创建的label3,我设置系统默认字体";
    [self.view addSubview:label3];

效果:

时间: 2024-11-03 22:37:13

运用Runtime全局修改UILabel的默认字体的相关文章

iOS运用runtime全局修改UILabel的默认字体

iOS运用runtime全局修改UILabel的默认字体 一.需求背景介绍 在项目比较成熟的基础上,遇到了这样一个需求,应用中需要引入新的字体,需要更换所有Label的默认字体,但是同时,对于一些特殊设置了字体的label又不需要更换.乍看起来,这个问题确实十分棘手,首先项目比较大,一个一个设置所有使用到的label的font工作量是巨大的,并且在许多动态展示的界面中,可能会漏掉一些label,产生bug.其次,项目中的label来源并不唯一,有用代码创建的,有xib和storyBoard中的,

如何修改IOS的默认字体

The first is workaround wich is iterating over all the labels in your UIView and change the labels font, check this question and the answers: How to set a custom font for entire iOS app without specifying size. The Second is creating a Category for y

修改outlook的默认字体

打开Outlook,找到"工具"---"选项": 2.在上面的图中,点击"邮件格式"选项: 3.单击"信纸和字体"选项打开如下图: 4.分别点击上图中用红色圈起来的选项即可更改. 修改outlook的默认字体,布布扣,bubuko.com

修改Arduino IDE默认字体

文件->首选项 点击直接编辑下面那个文件 修改editor.font这个条目就可以不用那么毁眼了..

QT的默认字体居然是MS Shell Dlg 2

WIN10下的默认字体居然是Segoe UI,造成各Windows版本显示不一致,可以这样修改Windows的默认字体(重启后生效): [HKEY_LOCAL_MACHINE>>SOFTWARE>>Microsoft>>WindowsNT>>CurrentVersion>>FontSubstitutes:Segoe UI = Tahoma] 但是最好还是软件自己指定显示字体,这样才能做到可控,这样设置全局字体: QFont font; font.

修改 Semantic UI 的默认字体

Semantic UI 默认使用的是谷歌提供的字体,并且是直接使用了谷歌的官方链接.由于大家都知道的原因,谷歌网站在国内访问速度很差,甚至根本无法访问,还有就是可能会在离线环境下使用 Semantic UI,不能总是依赖于在线字体,所以需要对 Semantic UI 的源文件进行一下手动修改. 1.首先根据上篇教程(http://www.cnblogs.com/xwgli/p/4770984.html)获取到 Semantic UI 未编译前的源代码: 2.找到并用文本编辑器打开源码中的文件:

修改Delphi工具控件的默认字体

修改Delphi工具控件的默认字体: 注册表: Delphi 6:    HKEY_CURRENT_USER\Software\Borland\Delphi\6.0Delphi 7:    HKEY_CURRENT_USER\Software\Borland\Delphi\7.0下增加一个名为“FormDesign”的项,再在这个项下面新建一个字符串值:新建字串:DefaultFont ,值为: 宋体,9[注意不是原来的Form Design 项,新建项没有空格] 参考:http://www.c

修改input框默认显示的字体颜色

修改input框默认显示的字体颜色(还可以修改字体大小) //chrome谷歌浏览器,Safari苹果浏览器 input[name="color"]::-webkit-input-placeholder { /* WebKit browsers */ color: red; font-size:15px;} //firefox火狐浏览器input[name="color"]:-moz-placeholder { /* Mozilla Firefox 4 to 18

Win 10 、Win 8 系统默认字体如何修改为宋体

Win 10 字体改为宋体方法:新建一个文本文档txt,将如下代码复制进去:Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts]"Microsoft YaHei & Microsoft YaHei UI (TrueType)"="simsun.ttc"[HKEY_LOCAL_MACHINE\SOFT