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 <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个字号 达到目的,在实际的需求之中,我们还可以用来更换产品给出的不同的字体以及字号大小
RunTime的使用-Category改变整个项目全部字体相关推荐
- 动态改变vue项目页面的title
其实也没啥,就是一句代码的事,只不过看在哪里执行而已.这句代码是: document.title = "新题目"; 一.动态改变vue项目页面的title vue只是一个前端框架, ...
- RichTextBox 改变每行的字体颜色
RichTextBox 改变每行的字体颜色 1.新建方法AppendTextColorful(this RichTextBox rtBox, string text, Color c ...
- IDEA 入门:安装使用详解(创建项目/包/类、运行/关闭/导入项目、字体/字号设置、常用快捷键等)
文章目录 前言 一.创建新项目 Project 1.1.选择"Create New Project" 1.2.选择左下角的"Empty Project" 1.3 ...
- springboot项目添加自定义字体
最近项目中有个做二维码的功能,需要在二维码下方添加些汉字.代码写完之后再本地测试了一下没有什么问题,放到线上运行后发现二维码下方的汉字都变成方框了. 查了一下原因 变成方框的问题是因为linux系统中 ...
- vue如何动态获取数据改变背景颜色和字体颜色以及获取图片
vue如何动态获取数据改变背景颜色和字体颜色以及获取图片 首先要想获取多条数据要用到v-for循环,写到循环就必须写:key 话不多说上代码 重点就是:style="{background: ...
- H5(nuxt)项目引入字体
H5(nuxt)项目引入字体 闲话少说 方法1: 1.下载所需要的字体,.ttf格式本文以(FZCYJ.ttf 为例) 2.先自己定义一个font.css文件,字体文件的路径引入 @font-face ...
- vue-cli项目引入字体包
vue-cli项目引入字体包 vue-cli项目引入字体包 vue-cli项目引入字体包 1.先下载字体文件所需的.ttf文件 2.将字体文件引入 自己在src文件定义一个common文件夹,在fon ...
- h5引用项目里css_H5(nuxt)项目引入字体
H5(nuxt)项目引入字体 闲话少说 方法1: 1.下载所需要的字体,.ttf格式本文以(FZCYJ.ttf 为例) 2.先自己定义一个font.css文件,字体文件的路径引入 @font-face ...
- linux修改字体为英文,如和改变linux中的字体为英语??
如和改变linux中的字体为英语?? 答案:2 信息版本:手机版 解决时间 2020-05-25 07:45 已解决 2020-05-25 04:32 在装linux 是只装了简体中文的字体 在使用 ...
最新文章
- php上传照片到s3云服务器,PHP上传文件到AWS S3生成下载文件URL
- Log4net中的RollingFileAppender解析
- SVN报错working copy is not uptodate
- 实例手册_独家数据 | 1820Fall 香港研究生商科类14个热门专业 1400+申请实例汇总...
- 阿里云Aliplayer高级功能介绍(一):视频截图
- 16位的数字高字节和低字节_显示掩盖较低和较高的16位数字半字节| 8086微处理器...
- linux7给用户授权,CentOS7 添加新用户并授权
- LNMP(Linux、Nginx、MySQL、PHP)安装部署
- html出现滚动条页面闪动,CSS3 calc实现滚动条出现页面不跳动闪动
- Ajax请求生成中文乱码问题
- Ubuntu tomcat
- java连接数据库实现一个简单的登陆界面
- Scala快速入门到精通 视频教程 百度云网盘下载地址
- 【S交换机技术连载帖】交换机在江湖系列-序言
- 读书百客:《白马篇》赏析一
- 公众号第三方平台开发 创建公众号第三方平台
- 管理者的50堂课之创始人篇 读书笔记
- CWnd与HWND的区别与转换 如何获取本窗体对象
- 真实案例,手把手教你构建用户画像
- JS几行代码实现数字炸弹游戏
热门文章
- CImg库中CImg,CImgList,CImgDisplay三个类的介绍
- 【C】printf warning: unknown conversion type character ‘l‘ in format [-Wformat=]
- 【物联网】NB-IoT简介
- ctypealpha php_php ctype函数中文翻译和示例
- python nginx部署_Python 应用 uWSGI + Nginx 部署
- share extension 不显示_你所不知道的网红小酒馆Helens
- 虚拟机看服务器mac地址,虚拟机修改服务器mac地址吗
- 微信小程序如何进行登录授权和获取用户信息
- linux esd转iso,window_Win10 TH2正式版10586官方ESD映像怎么转换成ISO镜像?,今天phpstudy分享了Win10 TH2(Build - phpStudy...
- 微软浏览器适配问题前端_「图」微软新贡献:修复Chromium浏览器的奇怪触控板手势问题...