XIB字体等比自动适配

作者: 王家薪 | 来源:发表于2017-11-14 16:38 被阅读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外 对其他可以设置字体的控件也有效,方法相同

相关文章

  • XIB字体等比自动适配

    事出有因 一般情况下,设计给出的图都是按照6的屏幕大小来做的,并且他们还希望我们做出来的样子在所有的屏幕上展示的都...

  • IOS 适配方案

    在公司项目中,我用到了xib设置约束,Masonry,比例适配,三种适配方案的结合来达到项目中的页面适配,字体适配...

  • storyboard/xib字体适配

    问题:iPhone与IPad显示不同字体大小 跟着图片步骤: 第三步弹窗:(两个为Regular为IPad) 通过...

  • iOS开发技巧 - runtime适配字体

    一个iOS开发项目无外乎就是纯代码布局、xib或SB布局。那么如何实现两个方式的字体大小适配呢?字体大小适配---...

  • iOS 在xib中给控件添加自定义属性

    使用场景:在xib,给UILabel做字体大小适配,添加自定义字体等 步骤: 添加UILabel的分类。比如:UI...

  • iOS:xib文字、屏幕等比缩放适配

    ScaleWithScreen iOS:xib屏幕适配 经过在网上找到许多方法集中处理,终于可以进行XIB屏幕适配...

  • iOS字体大小的自动适配(代码&xib)

    基本原理 1.计算iPhone屏幕尺寸与UI设计稿的尺寸比例 2.利用runtime机制,将原始字体大小值进行比例...

  • html----rem结合vw布局

    1.rem rem是相对于根元素的字体大小的单位 rem能等比例适配所有的屏幕,根据html的字体的大小来控制re...

  • 解决IOS10字体适配问题(下)

    上一篇 解决IOS10字体适配问题(上) 讲解了纯代码布局的解决方案, 但在这XIB泛滥的时代, 必须把XIB也解...

  • 2-移动端适配问题

    解决网页在移动端的适配问题,一般的思路是通过查询设备的屏幕大小,自动对元素进行等比缩放,如果是PC端的适配问题就是...

网友评论

  • CoderChou:参考您的文章,核心code是:self.font = [UIFont fontWithDescriptor:self.font.fontDescriptor size:self.font.pointSize * WJXScaleAdapter];
    于是尝试编写UIFont的分类交换fontWithDescriptor:size:,这样可以一劳永逸的解决字体大小问题(不管是label,还是button),但是并没有成功,能否告诉我原因?期待您的挥发
    并没有成功,请问什么原因,期待您的回答
    王家薪:@CoderChou fontWithDescriptor:size 方法是为了修改字体大小的; awakeFromNib 才是XIB 初始化执行的方法
    CoderChou:@王家薪 谢谢您的回复,fontWithDescriptor:size 该方法只会在xib初始化仅执行一次,您是怎么发现fontWithDescriptor:size的
    王家薪:之所以选择交换 awakeFromNib 是因为这个方法系统只会在 view 从 XIB 创建的情况下调用且只调用一次 这样保证了只会修改从 XIB 初始化的 view 不影响之后的修改或者用代码创建的 view
    至于 fontWithDescriptor:size:系统不会在初始化字体的时候调用他,我使用这个方法也仅仅是为了保证在修改字体大小的时候不会改变字体在 XIB 上设置的样式

本文标题:XIB字体等比自动适配

本文链接:https://www.haomeiwen.com/subject/wjdfvxtx.html