XIB和StoryBoard一直都是iOS开发布局中的一个重点,大家也很喜欢使用它快速的勾勒出好看的图形界面。我们在使用中,同时也伴随着一个问题,不同型号的手机屏幕宽度高度都不一样,我们在设置约束的时候都是固定的数值,这样就会造成屏幕上显示的效果大不相同。为了能在不同尺寸的手机上显示出相似的效果。对约束进行动态计算,然后得到对应比例的尺寸。
NSLayoutConstraint的分类
我们通过对NSLayoutConstraint添加分类属性,让我们能动态的计算约束的结果
我们定义一个可视化属性,所以我们需要使用IBInspectable来修饰这个属性。
@interface NSLayoutConstraint (IBAdapter)
@property (nonatomic, assign) IBInspectable BOOL adapterScreen;
@end
因为分类添加的属性需要通过关联对象的技术才能实现get和set。同时.m文件需要导入runtime.h.
先定义两个宏,用来计算适配之后的约束尺寸
define BaseWidth 375
define AdaptW [[UIScreen mainScreen] bounds].size.width / BaseWidth * 1.00
实现set方法
static char *adapterKey = "adapterKey";
-(void)setAdapterScreen:(BOOL)adapterScreen{
BOOL flag = adapterScreen;
objc_setAssociatedObject(self, adapterKey, @(flag), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
if(adapterScreen){
self.constant = AdaptW * (self.constant);
}
}
实现get方法
-(BOOL)adapterScreen{
BOOL flag = objc_getAssociatedObject(self, adapterKey);
return flag;
}
好了,整体的编码工作就结束了,编译一下项目,你就会发现,你的约束上面多了一个adapterScreen视图属性。选择on,那我们的这个属性就做好了适配。