iOS自动布局
自动布局:
1.Autoresizing
当UIView的autoresizesSubviews是YES时,(默认是YES), 那么在其中的子view会根据它自身的autoresizingMask属性来自动适应其与superView之间的位置和大小。注意: autoresizing只能设置当前控件与父控件之间的相对关系,可以进行屏幕适配
【autoresizingMask是子视图的左、右、上、下边距以及宽度和高度相对于父视图按比例变化,例如:
UIViewAutoresizingNone 不自动调整。
UIViewAutoresizingFlexibleLeftMargin 自动按比例调整与superView左边的距离,且与superView右边的距离不变。
UIViewAutoresizingFlexibleRightMargin 自动按比例调整与superView的右边距离,且与superView左边的距离不变。
UIViewAutoresizingFlexibleTopMargin 自动按比例调整与superView的顶部距离,且与superView底部的距离不变。
UIViewAutoresizingFlexibleBottomMargin 自动按比例调整与superView的底部距离,且与superView顶部的距离不变。
UIViewAutoresizingFlexibleWidth 自动按比例调整宽度。
UIViewAutoresizingFlexibleHeight 自动按比例调整高度。】
相关demo:UI基础day10-10自定义布局-代码-02-用代码实现autoresizing
2.Autolayout (勾选Use Auto Layout)—>一般需要设置上下左右或上下宽高四个约束,特殊控件不一定必须4个约束
随着iPhone发布苹果设备不同尺寸的屏幕变得越来越多, 不仅要求能根据控件父子关系来设置相对位置, 也要求能根据任意控件之间的关系来设置位置
因为 autoresizing只能设置当期控件与父控件之间的相对关系, 当遇到要设置兄弟控件之间的关系的时候 autoresizing就无能为力了,所以就需要Autolayout通过设置某控件与任意其他控件间的关系来决定如何显示这个控件, 不仅仅局限与父子控件
补充:【autolayout:不能满足设置一套约束,在所有的屏幕都适配,所以出现了sizeclass,size用来区分屏幕
sizeclass没有宽高:把宽高各分成了三种类型
regualr
compact
any
当宽度和高度各是某种类型的时候,就会确定某一类屏幕
所以确定九类屏幕,只是不屏幕进行了区分,具体的约束关系
还需要autolayout实现】
注意:autoresizing 和autolayout 二者是互斥的,同时只能使用其中一种,当使用autoresizing的时候必须禁用autolayout, 当使用autolayout的时候就无法使用Autoresizing了。
Autolayout当中有俩个核心概念:参照和约束
参照:通过参照其他控件或父控件来设置当前控件的位置和大小
约束Constraint(规则):通过添加约束限制控件的位置和大小
代码实现Autolayout的步骤
利用NSLayoutConstraint类创建具体的约束对象
添加约束对象到相应的view上
- (void)addConstraint:(NSLayoutConstraint *)constraint;
- (void)addConstraints:(NSArray *)constraints;
代码实现Autolayout的注意点
1》 要先禁止autoresizing功能,设置view的下面属性为NO
view.translatesAutoresizingMaskIntoConstraints = NO;
2》 添加约束之前,一定要保证相关控件都已经在各自的父控件上
3》不用再给view设置frame
了解内容,大部分都用SB来设置约束
【一个 《NSLayoutConstraint》 对象就代表一个约束
创建约束对象的常用方法
+(id)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;
view1 :要约束的控件
attr1 :约束的类型(做怎样的约束)
relation :与参照控件之间的关系
view2 :参照的控件
attr2 :约束的类型(做怎样的约束)
multiplier :乘数
c :常量
例子:[NSLayoutConstraint constraintWithItem:view1
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:superview
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:padding.top]
自动布局有个核心公式
obj1.property1 =(obj2.property2 * multiplier)+ constant value
】
框架:Masonry,“一个轻量级的布局框架,采用更"优雅"的语法封装自动布局”,不需要使用XIB和Storyboard, 并具有高可读性
方式一逐个设置 make.top.equalTo
方式二连续设置 make.top.left.bottom.and.right.equalTo
方式三一次性设置 make.edges.equalTo
例子:[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(superview).with.insets(padding);
}];
SnapKit:SnapKit是Masonry的Swift版 ,方法和Masonry类似
例子:view1.snp_makeConstraints { (make) -> Void in
make.edges.equalTo(superview).insets(UIEdgeInsetsMake(10, 10, 10, 10))
}这句代码的意思是view1+UIEdgeInsetsMake(10, 10, 10, 10)的外边距=superView
//使用框架的步骤
//1.首先导入头文件
//2.在使用框架的地方,导入主要的.h文件
//3.使用框架不需要去掉autoresizing