一、目的
有些公司在項(xiàng)目開(kāi)發(fā)中,可能應(yīng)用自己定義的字體樣式,這樣就涉及了字體設(shè)置的方法了,今天在這里用代碼簡(jiǎn)單演示一下,以備不時(shí)之需。
二、準(zhǔn)備
新建一個(gè)工程ChangeFont,然后將一個(gè)DS-DIGII.TTF的字體庫(kù)拖工程中,里面的工程目錄大概就是這樣的:

接下來(lái)我們可以在ViewController類中創(chuàng)建一個(gè)UILabel來(lái)顯示字體樣式:
UILabel *label = [[UILabel alloc] init];
label.frame = CGRectMake(100, 100, 160, 50);
label.backgroundColor = [UIColor yellowColor];
label.textAlignment = NSTextAlignmentCenter;
label.text = @"9876543210";
[self.view addSubview:label];
運(yùn)行結(jié)果:

三、改變字體
之前已經(jīng)把DS-DIGII.TTF這個(gè)文件拖進(jìn)去了,現(xiàn)在在plist文件里面配置一下。打開(kāi)plist然后加入名為Fonts provided by application的一行,在item里把字體名字加進(jìn)去。(ps:帶后綴)

在代碼中更改字體,如下:
(ps:字體文件名稱不代表字體名稱,所以不能直接在代碼中寫DS-DIGII.TTF文件名)
首先需要找出字體名稱,遍歷一下:
for(NSString *familyName in [UIFont familyNames]){
NSLog(@"Font FamilyName = %@",familyName); // 輸出字體族科名字
for(NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
NSLog(@"\t%@",fontName); // 輸出字體族科下字樣名字
}
}
最后找出了相對(duì)于沒(méi)有添加這個(gè)字體的工程多出的字體就是本次添加的字體了
結(jié)果:
// Font FamilyName = DS-Digital
// 2017-05-07 13:31:44.639 ChangeFont[9315:66825327] DS-Digital-Italic
換個(gè)姿勢(shì):
據(jù)說(shuō),在 Finder 里面找到這個(gè)TTF,雙擊打開(kāi),也能看到這個(gè)字體名稱:

接下來(lái)測(cè)試:
UILabel *label = [[UILabel alloc] init];
label.frame = CGRectMake(100, 100, 160, 50);
label.backgroundColor = [UIColor yellowColor];
label.textAlignment = NSTextAlignmentCenter;
label.text = @"9876543210";
label.font = [UIFont fontWithName:@"DS-Digital" size:16.0f];
[self.view addSubview:label];

OK!效果改變字體在這里就簡(jiǎn)單的實(shí)現(xiàn)了。
四、深思
有沒(méi)有感覺(jué)上面的方法很lou,控件多了就吐血了,其實(shí)可以利用runtime的class_addMethod、class_replaceMethod、method_exchangeImplementations這幾個(gè)方法實(shí)現(xiàn),代碼如下:
class_getInstanceMethod得到類的實(shí)例方法
class_getClassMethod得到類的類方法
#import <UIKit/UIKit.h>
@interface UILabel (FontChange)
@end
#import "UILabel+FontChange.h"
#import <objc/runtime.h>
#define CustomFontName @"DS-Digital"
@implementation UILabel (FontChange)
+ (void)load {
// load方法只會(huì)走一次,這里這里的執(zhí)行一次加不加都可以。提高容錯(cuò)率
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 獲得viewController的生命周期方法的selector
SEL systemSel = @selector(willMoveToSuperview:);
// 自己實(shí)現(xiàn)的將要被交換的方法的selector
SEL swizzSel = @selector(myWillMoveToSuperview:);
// 兩個(gè)方法的Method
Method systemMethod = class_getInstanceMethod([self class], systemSel);
Method swizzMethod = class_getInstanceMethod([self class], swizzSel);
// 首先動(dòng)態(tài)添加方法,實(shí)現(xiàn)是被交換的方法,返回值表示添加成功還是失敗
BOOL isAdd = class_addMethod(self, systemSel, method_getImplementation(swizzMethod), method_getTypeEncoding(swizzMethod));
if (isAdd) {
// 如果成功,說(shuō)明類中不存在這個(gè)方法的實(shí)現(xiàn)
// 將被交換方法的實(shí)現(xiàn)替換到這個(gè)并不存在的實(shí)現(xiàn)
class_replaceMethod(self, swizzSel, method_getImplementation(systemMethod), method_getTypeEncoding(systemMethod));
} else {
// 否則,交換兩個(gè)方法的實(shí)現(xiàn)
method_exchangeImplementations(systemMethod, swizzMethod);
}
});
}
- (void)myWillMoveToSuperview:(UIView *)newSuperview {
[self myWillMoveToSuperview:newSuperview];
// 不改變button的title字體設(shè)置的,在這里你可以判斷那種類型的改哪種不改,比如說(shuō)你不想改button的字體,把這一句解注釋即可
// if ([self isKindOfClass:NSClassFromString(@"UIButtonLabel")]) {
// return;
// }
if (self) {
if (self.tag == 000000) {
self.font = [UIFont systemFontOfSize:self.font.pointSize];
} else {
if ([UIFont fontNamesForFamilyName:CustomFontName])
self.font = [UIFont fontWithName:CustomFontName size:self.font.pointSize];
}
}
}
@end
然后不加任何代碼如下:
UILabel *label = [[UILabel alloc] init];
label.frame = CGRectMake(100, 100, 160, 50);
label.backgroundColor = [UIColor yellowColor];
label.textAlignment = NSTextAlignmentCenter;
label.text = @"9876543210";
// label.tag = 000000;
// label.font = [UIFont fontWithName:@"DS-Digital" size:16.0f];
[self.view addSubview:label];
這樣就可以實(shí)現(xiàn)了
------整理