make.height.equalTo(@20) 只是设置了高,Masonry还能同时设置宽高,比如make.height.and.width.equalTo(@20),优雅的实现了链式编程;
单个高度(或者宽度)的设置,只是利用了 MASViewContraint 的功能,但要想同时设置高宽,甚至其他信息,还需要 MASCompositeConstraint 的帮助;
make.height 执行完后,直接返回了MASViewContraint对象;
and 和 with方法,不发挥任何作用,只是优雅的以代码方式展现程序之美;
当再继续设置width(强烈建议作者把with方法去掉,经常写错)的时候,调用流程如下:
这个地方MASCompositeConstraint开始发挥作用,将旧的新的MASViewConstraint组装成一个NSArray,封装起来;并且设置delegate为MASConstraintMaker;
返回新生成的MASCompositeConstraint实例对象;
同时,通过方法(如下图)替换掉之前Maker的constraints(数组)保存的老的constraint;
make.height.and.width.equalTo(@20)执行最后equalTo(@20)的任务,落在了MASCompositeConstraint身上;(当然只是触发任务而已)
MASCompositeConstraint 并没有实现equalTo方法,抛给了父类,此处的调用流程和这里类似,只是MASCompositeConstraint实例对象对equalToWithRelation方法,有自己的实现;
只是遍历保存号的MASViewConstraint对象,再调用MASViewConstraint的方法而已;
至此,整个设置过程结束了;
make.height.and.width.and.left.equalTo(@20) 的调用流程在上面基础上多了一个 left的设置
left的调用流程和height 、width完全不一致;
width返回了一个MASCompositeConstraint实例化对象,调用MASCompositeConstraint的left方法
MASContraintMaker返回的newConstraint被加入到了 MASCompositeConstraint的 childConstraints当中;