一、使用Autoresizing进行约束
- 流布局,需要从上至下或从下至上布局,最上方或最下方的第一个控件约束将作为标定约束,之后的控件将根据该标定约束从上至下或从下至上逐个匹配约束。
- 优点
1.不需要单独为控件添加扩展类就能达到自动适配机型大小
2.可在storyboard中直接切换机型来观看真实效果
3.可在代码中设置控件frame位置 - 缺点
1.只能在垂直或水平方向进行单独放大缩小,无法对控件进行等比例放大缩小
2.只可设置控件与父控件之间的约束,无法设置同层级上多控件之间的相对约束
3.对于自计算控件,无法更具内容的多少自动调节大小
4.单个控件约束修改后无法自动更新其他控件,需要单个控件单个控件重新配置
二、使用Constraints进行约束
- 优点
1.可对控件进行等比例缩放
2.可设置同层级上多控件之间的相对约束
3.对于自计算控件,可根据内容的多少自动调节大小 - 缺点
1.无法在代码中直接使用frame设置控件位置
三、约束需要遵循遵循两大原则
- 确定控件的大小(宽高值) 自计算大小控件可不设置
自计算大小控件:UILabel、UIButton、UITextField等 - 确定控件的坐标位置
四、实例 (以下使用Constraints约束)
0.基本控件约束
-
约束设置不同组合方法
1.多文本相互约束
要求:
1.文本1当超过最大宽度后自动缩短,否则完整显示
2.文本2完整显示不缩短
3.文本3当超过最大宽度后自动缩短,否则完整显示
首先我们按照常规进行约束设置
1.设置图片的上左下间距,图片宽高
2.设置3个文本宽的水平位置及间距
这时我们会发现报错,为什么会发生这个错误呢?
由图可以看出文本1与文本2的间距为133,而我们设置的约束小于该间距,这时系统就需要对文本1与文本2进行填充处理,由于文本默认的『Content Hugging Priority』(即抗拉伸优先值) 都为251,故系统无法确认究竟要对哪个文本控件进行拉伸从而报错,这时我们只要改变文本的抗拉伸优先值即可消除错误,想要哪个文本优先拉伸就让其优先值更小即可,这里我们将文本1的优先值小于文本2的优先值。
当我们将文本1的内容增加时,发现又出现了错误,根据布局可以看出,这时文本1与文本2已经重叠,而要保证俩文本之间间距保持在设定值就必须对其中一个文本进行压缩,由于文本默认的『Content Compression Resistance Priority』(即抗压缩优先值) 都为750,故发生了上文同样的问题,系统无法确定究竟要对哪个文本控件进行压缩从而报错,这时我们只要改变文本的抗压缩优先值即可消除错误,想要哪个文本优先压缩就让其优先值更小即可,这里我们将文本1的优先值小于文本2的优先值。
父容器随子控件的大小变化而变化,适用于自计算宽高控件
2.UIScrollView的约束
向ScrollView内的SubView添加约束,报错,提示子控件缺少横轴或宽度相对位置,这里明显已经设置了SubView的左上右约束为10,高度约束为60,为什么还会出现该报错呢?
UIScrollView内部存在一个隐藏的ContentView,向UIScrollView添加的所有SubView都是添加在ContentView内,此时对SubView进行约束会直接导致ContentView只设置左上约束为0,而ContentView的大小需要通过SubView的约束,从而导致上文报错。
这里存在一个问题,对于固定宽度的SubView,直接设置宽度,对于宽度需要随着UIScrollView宽度变化的,则需要设置SubView相对于父容器居中,在这里有个特殊的地方,当选择居中时,其父容器自动判断为UIScrollView而不是ContentView,故而设置完成后,不需要设置宽度,ContentView也能计算出自身的宽度,从而达到需要的约束。
对于一个方向固定宽度,另一方向滑动的UIScrollView,对其固定宽度的设置相对居中,滑动的部分则直接设置其真实长度即可。
3.父容器随子控件宽度变化
-
这里由于UILabel能够根据字体及字数的多少自动计算其宽高,故可以不设置子控件的宽高值,对于其他非自计算宽高控件则需要单独设置宽高值才可以
4.多个控件均分宽度
-
上下左右约束可以根据需求随意设置,此处由于优先级相同,系统无法确定优先拉伸哪个,故报错。
-
多个控件,按住command后点选多控件后设置equal widths