当前位置: 首页 > 编程日记 > 正文

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个字号 达到目的,在实际的需求之中,我们还可以用来更换产品给出的不同的字体以及字号大小










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

相关文章:

android 耳机红外线,红外线耳机制作方法

本文介绍的语音红外转发器具有结构简单、易于制作、无干扰、低噪声的特点。工作原理&#xff1a;转发器由发射和接收两部分组成。见附图1。鉴频后的伴音(音频)信号经三极管V放大后推动红外发射管。由于发射管的发光强度与通过的电流成正比&#xff0c;所以D1、D2所发出的红外光…

解决load cycle count的一个偏方,告别硬盘卡卡响

load cycle count猛增&#xff0c;笔记本电脑硬盘喀嚓喀嚓响&#xff0c;我倒不担心硬盘寿命&#xff0c;但是实在烦人那声音&#xff0c;系统也时常被卡一下。我曾使用了hdparm -B 254 /dev/sda 的方法&#xff0c;但是硬盘升温太明显&#xff0c;右掌托烫得忍无可忍。苦寻方法…

AI工程的实践者:普元积极将场景落地,为企业提供智能化解决方案

作者 | Jane出品 | AI科技大本营11 月 8-9 日&#xff0c;CSDN 和 AICamp 联合举办的 AI 开发者大会在北京顺利举行。普元移动产品线总经理郝振明发表了《基于机器学习的工程实践》的主题演讲&#xff0c;并接受了 AI科技大本营的专访。以下内容为郝振明的演讲与采访总结&#…

android用户界面设计:基本按钮,Android用戶界面設計:基本按鈕

本文向你展示了在你的android應用程序中創建一個簡單的Button或ImageButton控件的步驟。首先&#xff0c;你會學到如何向你的布局文件中添加按鈕控件。然後你會學習如何用兩種方法處理用戶對按鈕的點擊。最後&#xff0c;我們討論android中按鈕控件一些其它的可用特性。第1步&a…

快速浏览Silverlight3 Beta:当HLSL遇上Silverlight

HLSL高级着色器语言&#xff08;High Level Shader Language&#xff0c;简称HLSL&#xff09;&#xff0c;由微软拥 有及开发的一种语言&#xff0c;只能供微软的Direct3D使用。 HLSL是微软抗衡GLSL的产品&#xff0c;同时不能与OpenGL标准兼容。他跟Nvidia的Cg非常相似。 看…

“80后”财富新贵创业秘诀

"80后"财富新贵创业秘诀:具有冒险和创新精神 不论是文化市场&#xff0c;还是经济市场&#xff0c;当许多人还认为还是“60后”或“70后”的天下时&#xff0c;“80后”财富新贵已在不知不觉中浮出水面&#xff0c;并试图用自己的实力证明新一代的崛起。李想、戴志康…

小插件 打开Android程序动画,android-单击小部件后如何启动活动?

这就是对我有用的…onUpdate方法代码应为&#xff1a;Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {for (int i 0; i < appWidgetIds.length; i) {int appWidgetId appWidgetIds[i];try {Intent intent new …

“深度学习之父”大谈AI:寒冬不会出现,论文评审机制有损创新

整理 | 琥珀出品 | AI科技大本营【AI 科技大本营导读】近日《连线》杂志发表了一篇文章&#xff0c;记录了与“深度学习之父” Geoffrey Hinton 围绕人工智能伦理、技术、学术等领域的采访实录。当被问到如今人工智能是否将走进寒冬时&#xff0c;Hinton 的回答非常坚决&#x…

金山词霸2009牛津版

http://download.iciba.com/Pw2009_oxf/Powerword2009Oxf.25269.4011.exe新版本的词霸2009牛津版的 需要的朋友下载看看 转载于:https://blog.51cto.com/zmdzhangzhe/112418

面向对象之数值的悲剧(8月28日会议有感)

枚举的悲剧 枚举基本用法大家应该都很熟悉&#xff0c;在我们去避免硬编码&#xff0c;增强代码可读性&#xff0c;可维护性方面很好用。不过话说枚举底层还是比较复杂的&#xff0c;以前看过一些关于枚举的说明。至少C#里边的枚举是很复杂的&#xff0c;本身是结构类型&#x…

C++虚函数探索!

C中的虚函数实现了C中的多态。昨天C老师着重讲了讲虚函数。这个很重要&#xff0c;也有点玄机在里面。 下面阐述一下理论&#xff1a; C的类机制中有支持多态的技术来解决抽象编程。使用的是滞后捆绑技术。即预先设定其成员函数虚函数性质&#xff0c;使得任何捆绑该成员函数的…

htc820+android+l,首款高通64位八核 HTC Desire 820评测

9月初的IFA2014展会期间&#xff0c;多款搭载64位处理器的新品智能手机扎堆发布&#xff0c;也算是拉开了64位处理器安卓手机的时代序幕。其中&#xff0c;最引人注目的新品之一莫过于HTC Desire 820&#xff0c;它于北京时间9月4日在德国柏林发布&#xff0c;拔得了全球首款64…

关于正则表达式 g,m 参数的总结,为了回答“正则表达式(/[^0-9]/g,'')中的/g是什么意思?”...

为了解答“正则表达式(/[^0-9]/g,)中的"/g"是什么意思&#xff1f;”这个问题&#xff0c;也为了能够便于大家对正则表达式有一个更为综合和深刻的认识&#xff0c;我将一些关键点和容易犯糊涂的地方再系统总结一下。 总结1&#xff1a;附件参数g的用法 表达式加上参…

那位13岁就当上老板的开发者是如何炼成的?

当我们听到有关年轻有为的企业家的故事时&#xff0c;大多会想到 25 到 30 岁左右的年轻人。毕竟&#xff0c;Google、亚马逊、Facebook、Twitter、LinkedIn、Pinterest、Instagram、Snapchat 以及其它很多公司的创始人都是在他们 20 多岁时创办的这些企业。随着人们与科技的联…

phonegap android,Phonegap 3不适用于Android Studio

对我来说,这似乎很简单,但我根本做不到.我已经成功安装了npm install -g phonegap并安装了phonegap.C:\var\www\sexdiaries.co.uk>phonegap create sexdiaries -n SexDiaries -i co.uk.sexdiaries.app然后,我被告知Here尝试运行andriod但出现以下错误C:\var\www\sexdiaries.…

安装VCenter提示数据库排序规则有问题

安装VCenter提示数据库排序规则有问题 有时候在安装sql server 数据库时你如果修改了排序规则&#xff0c;那么在安装VCenter时它会提示你的数据库排序规则有问题&#xff0c;不让你安装。这个时候你去修改一下数据库规则就可以继续安装了。 解决方法&#xff1a; 1.把安装光盘…

点滴印象中的周其凤校长

原文&#xff1a;[url]http://blog.sina.com.cn/s/blog_4908ded80100bbui.html?tj1[/url]2003年9月&#xff0c;我进入吉林大学读书&#xff0c;第二年周其凤成为吉林大学新任校长。此后的三年&#xff0c;我见过校长两次&#xff0c;这两次&#xff0c;校长的风格给我留下了深…

开源50万行代码,百亿广告分成,百度智能小程序能成吗?

作者 | 非主流出品 | AI科技大本营终于&#xff0c;BAT 在小程序的赛道上展开了激战&#xff0c;而这一场战争得到了百度前所未有的重视。9 月 4 日&#xff0c;百度总裁张亚勤称拉动百度业务的“新四小龙”——智能小程序、信息流、短视频/小视频以及百度云。紧接着&#xff0…

接近WinHEC 2008

第一次听说windows硬件工程大会还以为微软要讲她出的硬件的一个技术交流大会&#xff0c;后来才了解到是微软公司面向个人电脑终端、服务器、硬件设备以及驱动程序的最具前瞻性的全球硬件技术信息盛会。而不是讲硬件本身&#xff0c;是与硬件相关的软件产品。今年是第17届WinHE…

加深C# 中字符串前加@符号理解以及使用~~

先看代码(以下代码使用在C#&#xff0c;环境ASP.NET)&#xff1a; protectedvoidPage_Load(objectsender, EventArgs e) { test1("\a"); test1("\a"); test2("\a"); test2("\a"); test…

鸿蒙系统首批更新机器,鸿蒙系统升级名单

【鸿蒙系统升级名单】华为的鸿蒙系统算是早早放出消息的重量级产品&#xff0c;国产OS的名号也吸引了不少小伙伴的注意。很多朋友都想体验传闻已久的鸿蒙操作系统&#xff0c;但也担心自己的手机无法支持。那么&#xff0c;鸿蒙操作系统的升级名单到底有哪些呢机器呢?下面就让…

公开课报名 | 基于自定义模板的OCR结果的结构化处理技术

随着行业的发展和技术的成熟&#xff0c;文字识别&#xff08;OCR&#xff09;目前已经应用到了多个行业中&#xff0c;比如物流行业快递包裹的分拣&#xff0c;金融行业的支票单据识别输入&#xff0c;交通领域中的车牌识别&#xff0c;以及日常生活中的卡证、票据识别等等。O…

产生所有排列---旋转法------2013年1月22日

我觉得这是一个很巧秒的算法。思路非常直接&#xff0c;从代码里可以很容易看出来&#xff0c;再单步调试查看set数组的值就可以很清楚地明白算法的过程。代码如下:1 #include <stdio.h>2 #define MAX 10003 4 int n3; //the number of set element5 int set[MAX]{1,2,3…

VS Code 正在统治代码编辑器领地!

出品&#xff1a;CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;【CSDN编者按】代码编辑器之于程序员的重要性不言而喻。长久以来&#xff0c;Vim、Emacs等老牌编辑器一直占据着举足轻重的地位&#xff0c;但是近年来情况似乎发生了变化。根据软件工程师招聘网站Tripleby…

Linux主辅DNS数据不同步故障排除

Linux主辅dns数据不同步故障排除欢迎使用微信关注“云运维联盟”公众号&#xff0c;第一时间了解本博客动态&#xff01;在互联网中&#xff0c;我们知道任何一台提供应用服务的主机&#xff08;例如&#xff1a;HTTP、FTP等&#xff09;都有它一个便于记忆Domain Name&#xf…

c语言贝叶斯分类,基于朴素贝叶斯分类器的文本分类算法(C语言)

基于朴素贝叶斯分类器的文本分类算法(C语言)基于朴素贝叶斯分类器的文本分类算法(C语言).txt两个人吵架&#xff0c;先说对不起的人&#xff0c;并不是认输了&#xff0c;并不是原谅了。他只是比对方更珍惜这份感情。#include #include #include //_getcwd(), _chdir()#include…

开源项目哪家强?Github年终各大排行榜超级盘点(内附开源项目学习资源)

整理 | Jane出品 | AI科技大本营【导语】提到开源项目&#xff0c;2018 年注定是不平凡的一年。据 Octoverse 报告数据&#xff0c;仅在 2018 年&#xff0c;Github 上的新用户就比过去六年的用户总数还要多 &#xff0c;存储库数量近一亿&#xff0c;这些增长都要归功于开源社…

给现有MVC项目增加Web API支持

在MVC4中自带了Web API不再需要从Nuget中下载。 Step1&#xff1a;增加System.Web.Http&#xff0c;System.Web.Http.WebHost&#xff0c;System.Net.Http三个程序集的引用&#xff0c;都是4.0版本&#xff1b; Step2&#xff1a;增加路由&#xff0c;默认的路由代码如下 route…

word自动消除html标签,清理Word生成HTML的冗余;清理与清除HTML标签

众所周知&#xff0c;当直接将word中的内容复制到网页上时&#xff0c;会产生很多冗余代码&#xff1b;而现在&#xff0c;在线编辑器又很普遍&#xff1b;就包括&#xff0c;现在用的百度空间的这个文本编辑器&#xff0c;如果直接从WORD中写好的文章复制进来&#xff0c;本来…

开头轰轰烈烈,结局冷冷清清

开头轰轰烈烈&#xff0c;结局冷冷清清转载于:https://blog.51cto.com/xiaomage/115649