iOS XIB和StoryBoard的屏幕适配

2,638 阅读1分钟

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,那我们的这个属性就做好了适配。

整体代码如图所示