iOS开发技术分享ios实用开发技巧iOS 进阶

XIB字体等比自动适配

2017-11-14  本文已影响63人  王家薪

事出有因

一般情况下,设计给出的图都是按照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外 对其他可以设置字体的控件也有效,方法相同

上一篇 下一篇

猜你喜欢

热点阅读