AutoLayout
AutoLayout是一种基于约束的,描述性的布局系统。
- 基于约束 - 和以往定义frame的位置和尺寸不同,AutoLayout的位置确定是以所谓相对位置的约束来定义的,比如x坐标为superView的中心,y坐标为屏幕底部上方10像素等
- 描述性 - 约束的定义和各个view的关系使用接近自然语言或者可视化语言(稍后会提到)的方法来进行描述
- 布局系统 - 即字面意思,用来负责界面的各个元素的位置。
使用约束条件来描述布局,view的frame会依据这些约束来进行计算 ,一举解决了不同分辨率和屏幕尺寸下view的适配问题。
AutoLayout的特点
- AutoLayout可以指定任意两个view的相对位置,而不需要像Autoresizing Mask那样需要两个view在直系的view hierarchy中。
- AutoLayout不必须指定相等关系的约束,它可以指定非相等约束(大于或者小于等);而Autoresizing Mask所能做的布局只能是相等条件的。
- AutoLayout可以指定约束的优先级,计算frame时将优先按照满足优先级高的条件进行计算。
AutoLayout的使用
通过代码实现autolayout方法非常麻烦,因此通过拖拽创建相对方便快捷,但是在做一些支付信息,密码保护等功能的时候,尽量使用代码进行创建。
代码例子:
1.创建一个view
UIView*blueView=[[UIView alloc]init];
blueView.backgroundColor=[UIColor blueColor];
[self.view addSubview:blueView];
2.因为AutoLayout和Autoresizing不能重用,因此需要去掉autoresizing,所以可能添加约束的控件
self.view.translatesAutoresizingMaskIntoConstraints=NO;
blueView.translatesAutoresizingMaskIntoConstraints=NO;
3.给控件的属性赋值 ,并添加在对应视图上
//设置left
NSLayoutConstraint *leftBlue=[NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:20];
//设置right
NSLayoutConstraint *rightBlue=[NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1.0 constant:-20];
//设置top
NSLayoutConstraint *topBlue=[NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:30];
//设置height
NSLayoutConstraint *heighBlue=[NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0 constant:30];
//添加到对应参照控件上
[self.view addConstraints:@[leftBlue,rightBlue,topBlue]];
[blueView addConstraint:heightBlue];
4.通过sizeClass进行适配
因为autolayout不能满足设置一套约束,在所有的屏幕都适配,所以出现了sizeClass,size用来区分屏幕
sizeclass中把宽高各分成了三种类型regualr,compact,any,当宽度和高度各是某种类型的时候,就会确定某一类屏幕,当宽高均为any的时候,即可适配所有屏幕。 所以确定九类屏幕,只是不屏幕进行了区分,具体的约束关系,但是具体的实现 还需要autolayout来实现。