Masonry之 make.height.and.width.equalTo(@20)调用流程

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当中;

你可能感兴趣的:(Masonry之 make.height.and.width.equalTo(@20)调用流程)