在项目比较成熟的基础上,遇到了这样一个需求,应用中需要引入新的字体,需要更换所有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 <UIKit/UIKit.h>

@interface UILabel (ChangeDefaultFont)

@end

#import "UILabel+ChangeDefaultFont.h"
#import <objc/runtime.h>
@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个字号 达到目的,在实际的需求之中,我们还可以用来更换产品给出的不同的字体以及字号大小

本文转自 卓行天下  51CTO博客,原文链接:http://blog.51cto.com/9951038/1852328,如需转载请自行联系原作者

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

  1. 动态改变vue项目页面的title

    其实也没啥,就是一句代码的事,只不过看在哪里执行而已.这句代码是: document.title = "新题目"; 一.动态改变vue项目页面的title vue只是一个前端框架, ...

  2. RichTextBox 改变每行的字体颜色

    RichTextBox 改变每行的字体颜色 1.新建方法AppendTextColorful(this RichTextBox rtBox, string text, Color          c ...

  3. IDEA 入门:安装使用详解(创建项目/包/类、运行/关闭/导入项目、字体/字号设置、常用快捷键等)

    文章目录 前言 一.创建新项目 Project 1.1.选择"Create New Project" 1.2.选择左下角的"Empty Project" 1.3 ...

  4. springboot项目添加自定义字体

    最近项目中有个做二维码的功能,需要在二维码下方添加些汉字.代码写完之后再本地测试了一下没有什么问题,放到线上运行后发现二维码下方的汉字都变成方框了. 查了一下原因 变成方框的问题是因为linux系统中 ...

  5. vue如何动态获取数据改变背景颜色和字体颜色以及获取图片

    vue如何动态获取数据改变背景颜色和字体颜色以及获取图片 首先要想获取多条数据要用到v-for循环,写到循环就必须写:key 话不多说上代码 重点就是:style="{background: ...

  6. H5(nuxt)项目引入字体

    H5(nuxt)项目引入字体 闲话少说 方法1: 1.下载所需要的字体,.ttf格式本文以(FZCYJ.ttf 为例) 2.先自己定义一个font.css文件,字体文件的路径引入 @font-face ...

  7. vue-cli项目引入字体包

    vue-cli项目引入字体包 vue-cli项目引入字体包 vue-cli项目引入字体包 1.先下载字体文件所需的.ttf文件 2.将字体文件引入 自己在src文件定义一个common文件夹,在fon ...

  8. h5引用项目里css_H5(nuxt)项目引入字体

    H5(nuxt)项目引入字体 闲话少说 方法1: 1.下载所需要的字体,.ttf格式本文以(FZCYJ.ttf 为例) 2.先自己定义一个font.css文件,字体文件的路径引入 @font-face ...

  9. linux修改字体为英文,如和改变linux中的字体为英语??

    如和改变linux中的字体为英语?? 答案:2  信息版本:手机版 解决时间 2020-05-25 07:45 已解决 2020-05-25 04:32 在装linux 是只装了简体中文的字体 在使用 ...

最新文章

  1. php上传照片到s3云服务器,PHP上传文件到AWS S3生成下载文件URL
  2. Log4net中的RollingFileAppender解析
  3. SVN报错working copy is not uptodate
  4. 实例手册_独家数据 | 1820Fall 香港研究生商科类14个热门专业 1400+申请实例汇总...
  5. 阿里云Aliplayer高级功能介绍(一):视频截图
  6. 16位的数字高字节和低字节_显示掩盖较低和较高的16位数字半字节| 8086微处理器...
  7. linux7给用户授权,CentOS7 添加新用户并授权
  8. LNMP(Linux、Nginx、MySQL、PHP)安装部署
  9. html出现滚动条页面闪动,CSS3 calc实现滚动条出现页面不跳动闪动
  10. Ajax请求生成中文乱码问题
  11. Ubuntu tomcat
  12. java连接数据库实现一个简单的登陆界面
  13. Scala快速入门到精通 视频教程 百度云网盘下载地址
  14. 【S交换机技术连载帖】交换机在江湖系列-序言
  15. 读书百客:《白马篇》赏析一
  16. 公众号第三方平台开发 创建公众号第三方平台
  17. 管理者的50堂课之创始人篇 读书笔记
  18. CWnd与HWND的区别与转换 如何获取本窗体对象
  19. 真实案例,手把手教你构建用户画像
  20. JS几行代码实现数字炸弹游戏

热门文章

  1. CImg库中CImg,CImgList,CImgDisplay三个类的介绍
  2. 【C】printf warning: unknown conversion type character ‘l‘ in format [-Wformat=]
  3. 【物联网】NB-IoT简介
  4. ctypealpha php_php ctype函数中文翻译和示例
  5. python nginx部署_Python 应用 uWSGI + Nginx 部署
  6. share extension 不显示_你所不知道的网红小酒馆Helens
  7. 虚拟机看服务器mac地址,虚拟机修改服务器mac地址吗
  8. 微信小程序如何进行登录授权和获取用户信息
  9. linux esd转iso,window_Win10 TH2正式版10586官方ESD映像怎么转换成ISO镜像?,今天phpstudy分享了Win10 TH2(Build - phpStudy...
  10. 微软浏览器适配问题前端_「图」微软新贡献:修复Chromium浏览器的奇怪触控板手势问题...