前言
AutoLayout非常强大也非常易用,可读性也很强,加上各种第三方AutoLayout库,让你布起局来犹如绷掉链子的狗!但在使用中也有各种各样的问题,下面就来给大家详细介绍下。
AutoLayout 问题
布局冲突 固有尺寸冲突 布局和固有尺寸冲突主要概念
固有尺寸 intrinsicContentSize(意思就是说我知道自己的大小,如果你没有为我指定大小,我就按照这个大小来。) hugging,compress priority constraint:equal,unequal一个UIView显示,需要有2个元素,position & size。AutoLayout可以确定view 的这两个,so 不用frame。
1、布局遇到的问题
布局绝对冲突:
eg 设置了 view 的左右,然后又有个 width,造成冲突
解决方案:
1.设置优先级(低优先级constraint没有用到的时候的时候系统默认忽略)
2.删除没有的constraint(常用)
2、布局模糊冲突
假设UIView2的宽度不能超过50。当UIView1宽度小于50的时候,二者等宽;
当UIView1宽度大于50的时候,UIView2不受UIView1宽度的影响。
于是给UIView2加上一条约束:宽度<=50。这时候冲突来了:
因为UIView1的宽度是定好的,而UIView2和UIView1等宽。那么UIView2的宽度就是确定的。
so 当宽度 > 50 的时候,就是冲突,<= 50 的时候就不是冲突
解决方案:
equal width priority 设置低一些,这样让 View2 先满足<= 50的 constraint,当他的width <= 50 的时候equal width生效
enum {
UILayoutPriorityRequired = 1000,
UILayoutPriorityDefaultHigh = 750,
UILayoutPriorityDefaultLow = 250,
UILayoutPriorityFittingSizeLevel = 50,
};
1、intrinsic冲突
content Hugging/content Compression Resistance 设置优先级解决intrinsicContentSize
Hugging (不想填充空间) Compression (不想被挤压) 有这两个特性的 view 一定实现了 intrinsicContentSize Hugging 默认 priority = 250 Compression 默认 priority = 750 其他 constraint 默认 priority = 1000(最大)当 constraint.priority > hugging.priority View会被拉伸
当 constraint.priority < hugging.priority View会被抱紧在priority小的那一边
当 constraint.priority > compression.priority View 会被挤压
当 constraint.priority < compression.priority View 不会被挤压
eg UILabel 有intrinsicContentSize 那么UILabel的size 就用它,
如果有constraint 设置了 size 那么使用 constraint的
UILabel1、和UILabel2布局 :










