事出有因
一般情况下,设计给出的图都是按照6的屏幕大小来做的,并且他们还希望我们做出来的样子在所有的屏幕上展示的都一样,这样就需要等比例适配了
代码创建的怎么解决
如果是代码创建的,我们可以通过一个宏定义解决
#define kScreenWidth [UIScreen mainScreen].bounds.size.width
#define font(R) (R)*(kScreenWidth)/375
kScreenWidth
是获取的屏幕宽度,通过屏幕比例计算,来得到最终的字体大小,使用起来也比较方便
label.font = [UIFont systemFontOfSize:font(12)];
XIB如何做
如果是XIB
创建的,我们再去这样每个都重新都设置一遍字体,岂不是无端增加工作量,最好的办法是在XIB
里面设置字体大小后自动进行等比缩放.
我的思路是这样的,通过XIB
创建的视图在初始化的时候都会调用awakeFromNib
方法,通过交换方法,实现为awakeFromNib
方法增加下面的这一行代码
#define WJXScaleAdapter ((CGFloat)(WJXSCREEN_WIDTH / 375.0))
//-----------
self.font = [UIFont fontWithDescriptor:self.font.fontDescriptor size:self.font.pointSize * WJXScaleAdapter];
self.font.fontDescriptor
可以得到当前字体的样式,只改变大小,不能改变字体的样式
完整代码
定义一个 category 实现以下代码
@implementation UILabel (TMLayoutFont)
// 在load方法中实现让 jx_awakeFromNib 和 awakeFromNib 方法交换 不明白的可以搜索下 ios 方法交换
+ (void)load {
Method method3 = class_getInstanceMethod([UILabel class], @selector(jx_awakeFromNib));
Method method4 = class_getInstanceMethod([UILabel class], @selector(awakeFromNib));
if (!class_addMethod([UILabel class], @selector(awakeFromNib), method_getImplementation(method3), method_getTypeEncoding(method3))) {
method_exchangeImplementations(method4, method3);
} else {
class_replaceMethod(self, @selector(jx_awakeFromNib), method_getImplementation(method4), method_getTypeEncoding(method4));
}
}
// 方法交换以后 当系统调用 awakeFromNib 方法的时候实际上会调用 jx_awakeFromNib 方法
- (void)jx_awakeFromNib {
[self jx_awakeFromNib];
self.font = [UIFont fontWithDescriptor:self.font.fontDescriptor size:self.font.pointSize * WJXScaleAdapter];
}
除了UILabel
外 对其他可以设置字体的控件也有效,方法相同