前言
在此我不是和大家讨论,xib相对约束的使用,因为这些文章网上有一大堆的资料,这也不是我今天想要讲的东西。
不知道大家平常有没有碰到过这样的情况。相信很多人在开发中都会使用storyboard和xib来写界面,所见即所得,拖拖拽拽就大工告成了,爽的很。不像纯代码写界面,还要各种alloc、addSubview。可提测后,UI设计师坐在你身边,对UI各种细节调整席卷而来。因为一般设计师是按照4.7屏幕来设计的,这个屏幕下的显示效果没问题,到了小点的屏幕或者大点屏幕的时候,就各种不满意了,各个控件的比例关系并不是他们想要的。每当这个时候就要从xib拉出NSLayoutConstraint属性来动态设置了。还有字体也是,xib设置了,还要钻进代码里面再动态设置一番,真是恶心死了!
所以我在想为什么不能像安卓屏幕适配一样,一切都是等比例适配,我们只要对着一个屏幕尺寸去做开发,其他的自动等比例缩放(按照基准屏幕的宽度去缩放,比如屏幕宽度375的控件width = 10pt,那么屏幕宽度750时就是width = 20pt了)。
解决方案
下文就是我针对上面的问题,提出的三种解决方案。
第一种:纯代码实现
为了能够更加好的控制这些UI控件的布局和设置,我开始在新项目中用纯代码去写界面了。虽然用的是Masonnry自动布局,但也难免要设置具体的值,在设值时,我会在加一层AdaptW(floatValue)宏定义包装。
- (void)private_addConstraintForSubViews
{
[self.titleView mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo(AdaptW(55));
make.left.right.equalTo(self);
make.top.equalTo(self);
}];
[self.pageCtl mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.bottom.right.equalTo(self);
make.height.mas_equalTo(AdaptW(8));
}];
}
AdaptW(floatValue)其实就是一个BSFitdpiUtil工具类方法的调用,以常用的基准屏幕,iphone 6 的375x667尺寸去换算的。代码如下:
#define kRefereWidth 375.0 // 参考宽度
#define kRefereHeight 667.0 // 参考高度
#define AdaptW(floatValue) [BSFitdpiUtil adaptWidthWithValue:floatValue]
#import
@interface BSFitdpiUtil : NSObject
/**
以屏幕宽度为固定比例关系,来计算对应的值。假设:参考屏幕宽度375,floatV=10;当前屏幕宽度为750时,那么返回的值为20
@param floatV 参考屏幕下的宽度值
@return 当前屏幕对应的宽度值
*/
+ (CGFloat)adaptWidthWithValue:(