背景:有时候我们需要在不同尺寸的屏幕上适配不同大小的字体
思路:不同尺寸屏幕不同字体大小通过【等比例缩放 or 加减】来实现
实现方法:
(1)方式1:宏定义
(2)方式2:runtime方法替换
注意:以下方法只能适配代码写的字体大小,对于xib设置的字体大小,后续补充
方案1: 宏定义(屏幕宽度做加减)
//宏定义
#define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)
#define FONT_SIZE(size) ([UIFont systemFontOfSize:FontSize(size)])
//字体适配 在PCH文件定义了一个方法
static inline CGFloat FontSize(CGFloat fontSize) {
if (SCREEN_WIDTH == 320) {
return fontSize - 1;
} else if (SCREEN_WIDTH == 375) {
return fontSize;
} else {
return fontSize + 1;
}
}
方案2: 宏定义(屏幕宽度做比例)
#define SizeScale (SCREEN_WIDTH/375.0)
#define kFont(value) [UIFont systemFontOfSize:value*SizeScale]
方案3:runtime(方法交换)
首先需要创建一个UIFont的分类UIFont+runtime。
#import "UIFont+runtime.h"
#import <objc/runtime.h>
#define MyUIScreen 375 // UI设计原型图的手机尺寸宽度(6), 6p的--414
@implementation UIFont (runtime)
+ (void)load {
// 获取替换后的类方法
Method newMethod = class_getClassMethod([self class], @selector(adjustFont:));
// 获取替换前的类方法
Method method = class_getClassMethod([self class], @selector(systemFontOfSize:));
// 然后交换类方法,交换两个方法的IMP指针,(IMP代表了方法的具体的实现)
method_exchangeImplementations(newMethod, method);
}
+ (UIFont *)adjustFont:(CGFloat)fontSize {
UIFont *newFont = nil;
newFont = [UIFont adjustFont:fontSize * [UIScreen mainScreen].bounds.size.width/MyUIScreen];
return newFont;
}
@end
然后外部正常调用
systemFontOfSize方法即可:
//外部正常调用系统设置字体方法即可
UILabel*l1=[[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 40)];
l1.text=@"你好哇,你好哇";
l1.font= [UIFont systemFontOfSize:10];
[self.view addSubview:l1];