本文只是笔者对iOS约束实现的一种猜想,可以用于帮助初学者理解和使用约束。至于Apple底层是否这样实现的我也没有去深入研究。
我第一次使用iOS的约束布局是用xib来拉约束的。当时感觉很神奇,因为我一旦拉错了,xcode能够马上提示你约束缺失或者约束冲突。我当时就纳闷底层怎么样建立这个模型来得出这组约束的合法性(因为笔者是数学系应用数学专业的,所以很多问题都想着怎么建立数学模型来转成数学问题解决)。我当时想了很久,最终发现约束和方程式有点像。所以就想着用方程式能否解决。最终想到了一个 解决方案:
约束最终目的就是使得控件能够在界面上正常显示,如果一个界面是一个坐标系,那么描述一个控件的显示只要知道控件的位置信息(x,y)和大小信息(宽,高)就可以了,也就是一个控件需要4个参数,而根据控件的位置信息和大小信息就能知道控件的边界信息、中心点信息 等控件的其他几何属性位置信息。而约束恰恰是描述控件的几何属性位置信息的关系,这就有了:
1、一个控件在界面上显示由4个参数决定,即位置信息(x,y)和大小信息(宽,高),所以一个控件4个未知数
2、一条约束相当于一个方程式
3、一组约束相当于一个方程组
4、求解这个方程组
a、方程组有无穷多个解: 约束缺失
b、方程组无解: 约束冲突
c、方程组有唯一解: 约束正确
根据代数学消元法解方程的规律:
如果方程式个数小于未知数个数,那么方程组存在无穷多个解。
对于约束就是也就是约束缺失,也就是说正常情况下约束条数一般就是控件个数的4倍。
但是像UIImageView,UILabel,UIButton等很多系统内置控件,自身大小可以根据内容做适配,也就是这些控件自身就已经隐含了两条大小约束,他们只要再加2条位置约束就行了。