一、目的
有些公司在项目开发中,可能应用自己定义的字体样式,这样就涉及了字体设置的方法了,今天在这里用代码简单演示一下,以备不时之需。
二、准备
新建一个工程ChangeFont,然后将一个DS-DIGII.TTF的字体库拖工程中,里面的工程目录大概就是这样的:
接下来我们可以在ViewController类中创建一个UILabel来显示字体样式:
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];
运行结果:
三、改变字体
之前已经把DS-DIGII.TTF这个文件拖进去了,现在在plist文件里面配置一下。打开plist然后加入名为Fonts provided by application的一行,在item里把字体名字加进去。(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); // 输出字体族科下字样名字
}
}
最后找出了相对于没有添加这个字体的工程多出的字体就是本次添加的字体了
结果:
// Font FamilyName = DS-Digital
// 2017-05-07 13:31:44.639 ChangeFont[9315:66825327] DS-Digital-Italic
换个姿势:
据说,在 Finder 里面找到这个TTF,双击打开,也能看到这个字体名称:
接下来测试:
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!效果改变字体在这里就简单的实现了。
四、深思
有没有感觉上面的方法很lou,控件多了就吐血了,其实可以利用runtime的class_addMethod、class_replaceMethod、method_exchangeImplementations这几个方法实现,代码如下:
class_getInstanceMethod得到类的实例方法
class_getClassMethod得到类的类方法
#import
@interface UILabel (FontChange)
@end
#import "UILabel+FontChange.h"
#import
#define CustomFontName @"DS-Digital"
@implementation UILabel (FontChange)
+ (void)load {
// load方法只会走一次,这里这里的执行一次加不加都可以。提高容错率
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 获得viewController的生命周期方法的selector
SEL systemSel = @selector(willMoveToSuperview:);
// 自己实现的将要被交换的方法的selector
SEL swizzSel = @selector(myWillMoveToSuperview:);
// 两个方法的Method
Method systemMethod = class_getInstanceMethod([self class], systemSel);
Method swizzMethod = class_getInstanceMethod([self class], swizzSel);
// 首先动态添加方法,实现是被交换的方法,返回值表示添加成功还是失败
BOOL isAdd = class_addMethod(self, systemSel, method_getImplementation(swizzMethod), method_getTypeEncoding(swizzMethod));
if (isAdd) {
// 如果成功,说明类中不存在这个方法的实现
// 将被交换方法的实现替换到这个并不存在的实现
class_replaceMethod(self, swizzSel, method_getImplementation(systemMethod), method_getTypeEncoding(systemMethod));
} else {
// 否则,交换两个方法的实现
method_exchangeImplementations(systemMethod, swizzMethod);
}
});
}
- (void)myWillMoveToSuperview:(UIView *)newSuperview {
[self myWillMoveToSuperview:newSuperview];
// 不改变button的title字体设置的,在这里你可以判断那种类型的改哪种不改,比如说你不想改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];
这样就可以实现了
------整理