一、可视化格式约束介绍:
可视化格式由一个描述视图的文本字符串组成。你根据项出现的顺序依次列出他们。文本序列指定间隔,不等量和优先级。结果将布局形象化地表现为一个简短的文本。
如:
NSLayoutConstraint.constraints(withVisualFormat: "V:[viwe1]-8-[view2]", options: .alignAllLeading, metrics: nil, views: ["view1":view1,"view2":view2])
注意点:
- 坐标轴(方向),指定前缀为 H:或者 V:;当忽略时,默认为水平布局。但鼓励使用前缀。
- 每个视图的变量名出现在方括号中。如:[View1]
- 字符串中视图名称的顺序与布局中视图的请求顺序匹配。一般是从上到下或者从左到右。
- 两个视图的固定间隔以一个数字常量的形式出现,如:-8-。连字符围绕着该数字。
- 选项参数指定对齐方式。
- 度量字典参数(metrics):使用时,该参数为约束中的值代替提供常量数值。
- 参数Views并不是传递一个视图数组,它传递一个变量绑定字典。
二、为什么使用可视化格式?
- 更简洁,一个可视化格式便可表示多个约束才能描述的布局条件。
- 它更容易检查。可视化格式讲述了一个布局小故事,你可以将注意力集中在更凝练的想法上。
- 它更容易进行调整,如果你想要更新对齐方式或者调整间隔,只需要修改最后一个间隔。
三、格式字符串结构
遵循语法 : ( < orientation > : ) ? ( < superview > < connection > ) ? < view > ( < connection > < view > ) * ( < connection > < superview > )
3.1 视图名称:
通过一个变量绑定字典来关联视图的名称和视图实例。将该字典传给约束的创建方法,用于在名称和对象的之间建立映射关系。
(注:不可直接通过本地变量字符串)
3.1.1 父视图:
总是一个特殊的字符--------竖线符( | )。仅在格式字符串的开头或者结尾看见它。
无需在字典绑定,AutoLayout会知道“ | ” 是父视图。
样例:
- 延伸一个视图来适应其父视图:" H : | [ view ] | "
- 将一个视图偏离它的父视图的某条边:" V : [ view ] - 8 - | "
- 创建一列或者一行与父视图对齐的视图," V : | - [ view1 ] - [ view2 ] - [ view3 ] | [ view4 ] "
3.2 连接:
连接指定视图间的间隔。
3.2.3 空连接:
视图与视图之间 或者 视图与父视图之间没有指定任何间隔,如:" H : [ view1] [ view2 ] ", " V : | [ view1 ] "。
使用空连接来放置需要自然的相互毗邻。
(注:其优先级并不很高,若有其他约束会优先其他约束。)
3.2.3 默认间隔:
苹果官方虽未文档化,两个同级视图之间标准间隔为8,子视图到父视图标准间隔为20,这些间隔来源于苹果的Aqua用户标准界面。
如 " H : [ view1] - [ view2 ] ",表示两个视图的间隔为20。
3.2.3 灵活间隔:
例:" H : | - [ view1] - ( > = 0) - [ view2 ] - | "
即View1和view2的间隔至少为0。
使用一个很小的几何规则,这样就不会无意中干扰到其他的几何规则。
注:(可在()里面添加多个规则如:(>=50,<=100))
3.3 圆括号:
括号将非简单的 正数或者 度量名的间隔区分开来。
- 必须为任何使用负数值的间隔加上括号。 如: " H : | - [ view1] - (-5) - [ view2 ] - | "
3.4 优先级:
可以通过给格式字符串添加一个可选的值来设置布局请求的优先级。在任何连接或者尺寸规则后拼接一个字符@,@后是一个想要设置优先级的数值。
如:
" H : | - 5 @ 20 - [ view1 ] - [ view2 ] - | "
间隔规则的默认优先级为1000
3.5 视图尺寸:
可视化约束格式语言除了可以用方括号分割视图名称外,还可以在方括号中指定视图尺寸,如:
- 指定一个视图宽度为固定的120:"H : [ view ( 120 ) ] " 。如果你想显式的添加格式,也可以这样 "H : [ view ( ==120 ) ] "
- 可以指定视图的宽度至少为50点,如 "H : [ view ( >= 50 ) ] " ,也可以指定视图的宽度在50 - 70之间 " H : [ view ( >= 50, <= 70 ) ] "
- 可以在尺寸请求中引用其他约束:
如:“view1(view2)”,使view1和view2的宽度一致。
注意:因为约束是无方向的,所以可以自我引用。循环定义不会产生性能损失。使用下列语句创建一个相等布局,"V:|-[view1(view2)]-[view2(view1)]-|" - 不是所有的视图都要参与视图匹配。“V:|-[view1(<=80)]-[view2]-[view3(view1)]-|”,该格式限制view1和view3,view2伸展时占据剩余空间。
- 视图尺寸也能表示优先级:**“V:|-[view1(==100@200)]-[view2(==300@500)]-|”*
- 不能在格式化约束中使用乘数表达相应的尺寸。
3.6 格式字符串部件