通常我们不做字体大小的适配,但有时候需求要你在不同尺寸屏幕上显示合适的字体大小,如果你用的系统字体大小方法systemFontOfSize:,那么可以写一个类别,然后什么都不用做,自动替换所有字体大小。
当然,此方法也适合替换其他方法,比如替换imageNamed:,可参考:http://blog.csdn.net/baidu_31326173/article/details/51590824
写一个UIFont类别
.h方法:
#import <UIKit/UIKit.h>
#import <objc/runtime.h>
#define IS_IPHONE_6 ([[UIScreen mainScreen] bounds].size.height == 667.0f)
#define IS_IPHONE_6_PLUS ([[UIScreen mainScreen] bounds].size.height == 736.0f)
// 这里设置iPhone6放大的字号数(现在是放大2号,也就是iPhone4s和iPhone5上字体为15时,iPhone6上字号为17)
#define IPHONE6_INCREMENT 2
// 这里设置iPhone6Plus放大的字号数(现在是放大3号,也就是iPhone4s和iPhone5上字体为15时,iPhone6上字号为18)
#define IPHONE6PLUS_INCREMENT 3
@interface UIFont (adapt)
+(UIFont *)adjustFont:(CGFloat)fontSize;
@end
#import "UIFont+adapt.h"
@implementation UIFont (adapt)
+(void)load{
//获取替换后的类方法
Method newMethod = class_getClassMethod([self class], @selector(adjustFont:));
//获取替换前的类方法
Method method = class_getClassMethod([self class], @selector(systemFontOfSize:));
//然后交换类方法
method_exchangeImplementations(newMethod, method);
}
+(UIFont *)adjustFont:(CGFloat)fontSize{
UIFont *newFont=nil;
if (IS_IPHONE_6){
newFont = [UIFont adjustFont:fontSize + IPHONE6_INCREMENT];
}else if (IS_IPHONE_6_PLUS){
newFont = [UIFont adjustFont:fontSize + IPHONE6PLUS_INCREMENT];
}else{
newFont = [UIFont adjustFont:fontSize];
}
return newFont;
}
@end
- load方法只会走一次,利用runtime的method进行方法的替换
- 替换的方法里面(把系统的方法替换成我们自己写的方法),这里要记住写自己的方法,不然会死循环
- 之后凡是用到systemFontOfSize方法的地方,都会被替换成我们自己的方法,即可改字体大小了
- 注意:此方法只能替换 纯代码 写的控件字号,如果你用xib创建的控件且在xib里面设置的字号,那么替换不了!你需要在xib的
awakeFromNib方法里面手动设置下控件字体