最近的项目需求需要使用新的字体,而且是在所有地方也就是说不管是普通的cell中的label,还是导航栏中的标题,都要使用设计新给出的字体。而新的字体包含在一个ttf的文件中。
乍一听到是挺浩大的一个工程,如果我是一个笨蛋的话估计会去每一个显示文字的界面,去修改相应的设置Font的方法,再稍微聪明一点可能在一个统一的地方编写一个比如- (UIFont *)customFontWithSize:(CGFloat)size
的方法,然后在需要的地方进行使用。这样的话呢,既浪费时间,又有可能会有遗漏的地方。
不过作为一个码(lan)工(ren) ,怎么可能让自己陷入那样的人民战争的汪洋大海呢?所以我使用了苹果提供的Category特性,来减少自己的工作量。
把大象放冰箱。。啊不不不,要实现category来自定义字体,分成几步?且听我来分解。
步骤一:在XCode新建文件时选择Category选项,并且新建关于UIFont的新Category,命名就叫UIFont+SGCustom吧。(SG没有任何的意思,可以是你们工程自己的前缀,这里的SG是“帅哥”的缩写XD)
步骤二:在新建立的Category的.m文件中,重写系统的+(UIFont *)systemFontWithSize:(CGFloat)size方法
相信你一定知道你的新字体的名称,所以你应该按这个方法来重新这个方法
+ (UIFont *)systemFontOfSize:(CGFloat)fontSize {return [UIFont fontWithName:@"YourFont" size:fontSize];}
等等 ,有警告!你是程序员你还在乎警告? 哈哈,开玩笑,当然如果你觉得这个警告很烦人或者有警告洁癖的话可以使用这段宏来忽略该警告:
#pragma clang diagnostic push#pragma clang diagnostic ignored "-Wdeprecated-declarations"// 在这里写入刚才那段代码,或者你想忽略警告的代码#pragma clang diagnostic pop
步骤三:重新运行你的程序,查看你所有的显示文字的界面。这时候你应该发现大部分的界面已经替换为你的新字体了。如果有一些地方还没有的话,请看看这些地方在设置字体的时候是否使用了刚才被重写的那个方法
写到这里我觉得大多数人都已经知道怎么弄了吧?等等,这位同学你说什么?哦,你不知道怎么引用ttf文件进工程啊?那个。。咳咳,好吧,我顺便说一下怎么把UI给出的新字体放进工程里。
还是那个按照大象放冰箱的思路来吧
步骤一:像是把图片或音频资源加入工程那样将其放进工程中步骤二:在plist里增加“Fonts provided by application”这个key ,并且增加item0,item0的值为你加进来的那个文件的名称。(这里我想预警一下,一会我们要使用的字体的名称可不一定是这个文件的名称哦)
如图所示:
步骤三:找到字体的名称。如果你不知道新给出的字体的英文!英文!英文!重要的事情说三遍!英文名称的话,你就要通过如下这段代码进行寻找了。
for (NSString* family in [UIFont familyNames]){NSLog(@"%@", family);for (NSString* name in [UIFont fontNamesForFamilyName: family]){NSLog(@" %@", name);}}
把所有的你的工程所支持的字体都打印出来,看哪个 更(bu)像(shun)是(yan) 新给出字体,那么把它的名称放到刚才的那个方法中就可以啦!~
好了, 快去试试吧~