由于本人很少用xib storyboard 所以这里的说是代码层面的适配.
手写代码,很多人在用代码适配都是使用Masonry或者UIView的Category,搭配上一个屏幕宽度比例或者高度比例的系数(
[[UIScreen mainScreen]bounds].size.宽或者高 / 屏幕的宽度或者高度)。其实用多了你会发现其实适配就是那么回事吧。
为什么这么说。在我理解,其实适配就是设计对这个控件摆放的一个要求。什么意思?
比如设计对屏幕上的这个button的要求就是在不同屏幕下都是距离上、左10px,宽高是100 * 100。那么这个button就不需要去适配。
UIButton *button = [UIButton new];
[self.view addSubview:button];
//Masonry写法
[button mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.top.equalTo(self.view).offset(10);
make.size.mas_equalTo(CGSizeMake(100, 100));
}];
//frame写法
button.frame =CGRectMake(10,10,100,100);
如果要求这个button在不同屏幕下会有相应的缩放,你可以去乘以一个系数比例。Tips:为了适配4和5(同宽度,不同高度),一般会乘宽度比较好,当然也可以乘以高度比,这里主要看需求。
//Masonry 写法
[button mas_makeConstraints:^(MASConstraintMaker *make) {
//如果仅仅是尺寸上的缩放,那么间距上也就不需要去乘系数。
make.left.top.equalTo(self.view).offset(10 * SCALE);make.size.mas_equalTo(CGSizeMake(100 * SCALE, 100 * SCALE));
}];
//frame写法
//如果仅仅是尺寸上的缩放,那么间距上也就不需要去乘系数。
button.frame = CGRectMake(10 * SCALE, 10 * SCALE, 100 * SCALE, 100 * SCALE);
if (SCREEN_WIDTH == 320) {
button.frame = CGRectMake(10,10,100,100);
}elseif (SCREEN_WIDTH ==375) {
button.frame = CGRectMake(12,12,100,100);
}else {
button.frame = CGRectMake(15,15,120,120);
}
Masonry和frame的比较:
1.在代码量方面,Masonry会偏多一些,frame在不需要计算行高的地方也就一行。
2.在影响方面,Masonry更新控件的约束会影响其他控件相对于这个控件的位置。 frame只会影响自己,并不会影响其他的控件。
举个例子:
leftButton.frame = CGRectMake(0, 0, 100, 100);
rightButton.frame = CGRectMake(leftButton.right , 0 , 100, 100);
改变leftButton的宽度 , leftButton.frame = CGRectMake(0, 0, 200, 100); 这时rightButton的x点还是100,并不会变成200.
如果使用Masonry
[leftButton mas_updateConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(200,100));
}];
这时rightButton x点的位置会变为200。
3.在执行顺序方面,Masonry代码执行时间不会立刻执行(block),frame会立刻执行。
4.控件设置方面, Masonry在某些特定情况优于frame。详情看Masonry官方demo。
总着来说,具体的适配,完全依赖于设计的要求。
使用适配的方式,看个人喜好和实际需求吧。怎么方便怎么来。
以上为个人看法, 写的不好的地方还请指正谢谢,如有问题,欢迎留言。