一、iOS屏幕适配发展历程
设备 适配技术
4 及以前(iPad未出) 直接用代码计算
有了iPad autoResizing
有不同屏幕的 iPhone 之后 autoLayout
有更多不同屏幕的iPhone之后 sizeClass
二、各个技术的特性
1、直接用代码计算
由于屏幕的大小都一样,只有横竖屏的情况,可以直接计算
2、autoResizing
适合于控件和其父控件的关系
、各属性的解释
属性 解释
UIViewAutoresizingNone 不会随着父试图的改变而改变
UIViewAutoresizingFlexibleLeftMargin 自动调整view与父试图做边距,以保证右边距不变
UIViewAutoresizingFlexibleRightMargin 自动调整view与父试图右边距,以保证做边距不变
UIViewAutoresizingFlexibleTopMargin 自动调整view 与父试图上边距,以保证下边距不变
UIViewAutoresizingFlexibleBottomMargin 自动调整view与父试图下边距,以保证上边距不变
UIViewAutoresizingFlexibleWidth 自动调整view的宽度,保证左边距和右边距不变
UIViewAutoresizingFlexibleHeight 自动调整view的高度,保证上边距和下边距不变
* view 的 autoresizesSubViews属性为YES 时(默认为YES),autoresizing才会有效
* 从Xcode6开始 Storyboard & Xib默认是自动布局,因此我们需要手动调整才能使用autoresizing
* auroresizing 可以组合使用,eg: UIViewAutoResizingFlexibleWidth | UIViewAutoResizingFlexibleBottonMargin
3、auroLayout
帮我们确定在不同设备、不同(父view环境下,同一个可视单元所应具有的合适位置和尺寸(任何两个试图的关系都可以确定)
*autoLayout 的用法:
*直接建立约束条件
[self.view addConstraint:[NSLayoutContranit constraintWithItem:blueView
arrtibutes:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:redView
attribute:NSLayoutAttributeLeft
multiplier:1
constant:0]];
这样虽然代码量比较大,但是是绝对可行的办法,也是使用autoLayout最根本的办法之一。
*使用VFL语言
- (void) viewDidLoad{
[super viewDidLoad];
UIButton *button = [UIButton alloc] init];
[button setTitle:@"点击一下“ forState:UIControllStateNormal];
button.translatesAutoresizingMaskIntoConstraints = NO;
[button setBackgroundColor:[UIColor blackColor]];
[self.view addSubView:button];
NSArray *constraints1 = [NSLayoutConstraint constraintsWithVisualFormat:@"@H:|-[button]-|"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(button)];
NSArray *constrains2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[button(==30)];
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(button)];
[selfview addConstraints :constraints1];
[self.view addConstraints:constraints2];
*使用第三方库如: Masonry、 UIView + AutoLayout ...
*autoLayout的好处
1)、你基本上可不用考虑3.5寸和4寸以及即将上市的x.x寸屏幕不同分辨率的问题,你终于可以不用在viewDidLoad方法里判断不同分辨率下,不同空间应放在哪里,或者针对不同分辨率写不同的storyboard和xib;
2)、你可以抛弃那些根据不同文字来计算tableView、UILable高度的代码了,因为autolayout会帮你自动计算好;
3)、如果你的布局在横屏竖屏下变化不是特别大,你不用再为横着竖着写两套代码或者写两个storyboard / xib 了;
4、sizeClass
在iOS8中,新增了Size Classes 特性,它是对当前所有iOS设备尺寸的一个抽象。那我们就把屏幕的宽和高分成三种情况: Compact:紧凑、Regular:宽松、Any:任意.
这样宽和高三三一整合,一共9种情况。如下图所示,针对每一种情况。我们可以再每种情况下设置不同的布局(包括控件的属性,甚至是空间是否显示)
对 sizeClass的理解
sizeClass 的实质是将iOS屏幕分成了不同的抽象概念,这些不同的抽象组合,对应着不同的设备屏幕。所以,利用sizeClass 可以针对同一套UI,来适配所有的屏幕。之一:这些所有的适配,都是利用autoLayout来实现的,sizeClass只是负责提供不同的屏幕尺寸。