在iOS6之前,大家都是通过UI控件的Frame属性和Autoresizing Mask来进行UI布局的。AutoLayout则是苹果公司在iOS6推出的一种基于约束的,描述性的布局系统。
Autolayout的使用又有多种方式:
- 使用storyboard或xib在可视化界面中添加约束
- 使用代码添加约束
- 使用VFL(Visual Format Language)语言来添加约束
- 使用第三方库,比如Masonry
代码添加约束
创建约束
NSLayoutConstraint *constrait = [NSLayoutConstraint
constraintWithItem:view1
attribute:attr1
relatedBy:relation
toItem:view2
attribute:attr2
multiplier:multiplier
constant:c];
该函数有多达7个参数,简单解释如下:
view1: 要约束的控件
attr1: 约束的类型(如NSLayoutAttributeLeft,是枚举常量)
relation: 与参照控件之间的关系,包括等于、大于等于、小于等于(如NSLayoutRelationEqual 是指等于,是枚举常量)
view2: 参照的控件
attr2: 约束的类型(如NSLayoutAttributeLeft,是枚举常量)
multiplier: 乘数,就是多少倍(1.0)
c: 常量,做好了上述的约束之后会加上这个常量(100)
约束计算公式:
添加约束的规则
在创建约束了之后,需要将其添加到作用的控件上才能生效:
- (void)addConstraint:(NSLayoutConstraint *)constraint NS_AVAILABLE_IOS();
- (void)addConstraints:(NSArray<__kindof NSLayoutConstraint *> *)constraints;
- 对于两个同层级 view 之间的约束关系,添加到它们的父 view 上。
- 对于两个不同层级 view 之间的约束关系,添加到他们最近的共同父 view 上。
- 对于有层次关系的两个 view 之间的约束关系,添加到层次较高的父 view 上。
- 对于比如长宽之类的,只作用在该 view 自己身上的话,添加到该 view 自己上。
代码添加约束的注意事项
- 要先禁止 autoresizing 功能,防止 AutoresizingMask 转换成 Constraints,避免造成冲突,需要设置 view 的下面属性为 NO:
- 添加约束之前,一定要保证相关控件都已经在各自的父控件上。
- 不用再给 view 设置 frame。
使用VFL
VFL全称是Visual Format Language,翻译过来是“可视化格式语言”。
VFL是苹果公司为了简化Autolayout的编码而推出的抽象语言。
VFL的原理与代码添加约束是一样的,不同的只是语法,官方给出的语法和示范如下:
官方链接:Visual Format Language