App的设计图根据是否可以滚动分成两种设计图,下面我们说说这个不可以滚动的设计,怎么在各种不同尺寸的设备中适配。


image.png

这是以iPhone8的尺寸(750*1334)做的效果图。

类似这种页面,就是不可滚动的效果图。

我们按照标注,在xib或者storyboard用autolayout布局;

为了展示效果图,在布局文件底部添加了一个正方形,居中显示


image.png


image.png


image.png


image.png


image.png

同样的布局文件,因为我们的标注是基于iPhone8的尺寸,结果只有iPhone8的显示效果图是满意的,其他设备的的效果图都无法接受。

设备

宽/缩放比

高/缩放比

效果图

750

1334

iPhone4s

640/0.85

960/ 0.72

iPhone5

640/0.85

1136/0.85

iPhone8

750/1.0

1334/1.0

iPhone8 Plus

1242/1.66

2208/1.66

iPhoneX

1125/1.5

2436/1.82

在ios的布局方式中,有一种自动布局叫做Autoresizing。

说明:这种布局方式不能与autolayout同时使用。


image.png


image.png


image.png


image.png


image.png

在不同设备上的效果,总体感觉还是可以,即使在最小的iPhone4s,也是可以显示完整的;但是,红色的正方形控件,在iPhone4s、iPhoneX上面变形了,如果这个正方形是ImageView的话,显示出来的图片也会变形了,这个肯定是不合格的。

但在Autoresizing这种布局上,没办法去处理这个问题。

设备

宽/缩放比

高/缩放比

效果图

750

1334

iPhone4s

640/0.85

960/ 0.72

iPhone5

640/0.85

1136/0.85

iPhone8

750/1.0

1334/1.0

iPhone8 Plus

1242/1.66

2208/1.66

iPhoneX

1125/1.5

2436/1.82

根据上图,各个设备的屏幕宽高与效果图的宽高的缩放比例是不同,只有iPhone8 Plus是近似相同。这就造成了上面的正方形控件变形的原因。

除此之外,我们还能怎么做呢。


image.png

- (void)viewDidLoad {
[super viewDidLoad];
CGRect rect = [UIScreen mainScreen].bounds;
float x = rect.size.width / 375;
float y = rect.size.height / 667;
NSLog(@"screen rect === %@",NSStringFromCGRect(rect));
NSLog(@"y==%@",@(y));
NSLog(@"x==%@",@(x));
// CGRect rect = [UIScreen mainScreen].nativeBounds;
// float x = rect.size.width / 750;
// float y = rect.size.height / 1334;
// NSLog(@"screen rect === %@",NSStringFromCGRect(rect));
// NSLog(@"y==%@",@(y));
// NSLog(@"x==%@",@(x));
//保证宽高的缩放比一致,才不会出现正方形控件变形的情况。
//取缩放比小的那个,才不会出现界面超出屏幕
if(x > y){
self.view.transform = CGAffineTransformMakeScale(y, y);
}else{
self.view.transform = CGAffineTransformMakeScale(x, x);
}
}

代码已经上传了 DEMO

补充

在xib或者storyboard用百分比布局

1.控件宽高的百分比


image.png


image.png

控件的宽高百分比这个简单

1).设置控件自身的宽高比;

2).设置控件的宽度等于父View的宽度,再设置Multiplier的比值(控件宽度:父View的宽度)

这样控件会随着屏幕的大小而缩放,控件自身也有宽高比,不会发生变形。

2.控件宽高的百分比


image.png

两个红色的控件,

第一个是距离左边距37.5的距离;在不同屏幕,这个值是固定的。

第二个是距离父View中线X坐标的0.2倍;在不同屏幕,这个值是变化的。

计算公式(iPhone8):375(屏幕宽)0.5(中线X坐标)0.2(系数)=37.5。

第一个控件:固定左边距


image.png

第二个控件:百分比左边距


image.png

跟第一个控件的用法,主要区别是

SecondItem:SuperView.Center.X;

Constant:0(固定值)

Multiplier:0.2(比例)

这样可以在不同的屏幕中,对比看到两个控件实际左边距的差别。

代码已经上传了 DEMO