xib适配机型
从接触ios开始,我就是忠实的可视化开发的搬运工——俗称UI拖拽师!
本编主要送给那些年热爱xib,喜欢效率的ios程序猿们。它可能解决你多年的心病!一直挥散不去的禁锢于代码的约束,一群技术大牛此时应该会鄙视,但我乐此不疲。
正题开始:此篇文章的主要内容是利用运行时和xib的机制,用少许的代码适配所有机型。简单粗暴而不失优雅!用了我这套方法你只要在375的xib里面随心所欲的约束,然后就可以适配刘海屏,plus屏,se屏等等。
-
首先我要引入一个关键字IBDesignable(此处应该有些掌声)
这个神奇的关键字IBDesignable的效果就是给xib的右边栏加一个属性列表,然后你可以通过属性列表将其赋值以达到针对不同机型来适配屏幕。 -
上图清晰的说明操作
1.建一个NSLayoutConstraint类别,给他加属性。
请注意给类别加属性需要用到运行时来实现。原理不就细说了,自己找度娘。继续上图
注意宏的定义是这个方法的关键,通过当前屏幕的尺寸和375的尺寸做对比。
做完这个功夫后,就差最后一步达到效果就是去开启这个效果!
image.png
image.png
选中一个纵向的约束 然后对应的去打开,由于我的命名太长被...代替了,他的顺序是和h文件命名的顺序一样,第一个是W横向的,第二个是H纵向的。所以我们打开纵向的。IBDesignable的关键词就起了作用,属性添加的是Bool值所有选的时候会出现ON和OFF。
通过这个操作,就可以随意操作xib了。然后布局完成后对应把所有的纵向和横向的依次设置一下开关,他就会随着屏幕的尺寸而放大和缩小。
-
很多朋友又要说:你这个值适配了约束,字体又不会变。那这个又怎么实现呢。来吧。第二步来了,干字体。
字体怎么加呢。其实也很简单!用运行时,根据xib的加载机制。在他加载的某个阶段把当下的字体取出来,然后根据相应的机型去设置字体大小就行了。来来来上图
利用runtime实现方法的转换,通过屏幕变换的比例进行字体的缩放;
#import <objc/runtime.h>
@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/375.0];
return newFont;
}