链式编程:
首先来看一个简单的链式调用例子:
我们可以通过点语法(getter方法)的方式调用
如果我们想要实现self.eat.work.play这种我们只要返回self就可以了。
调用.png如果想要传参数的话,可以将block作为方法的返回值
block做参数.pngMasonry源码学习:
Masonry其实就是封装了系统的NSLayoutConstraint的方法,简化了代码。
Masonry的使用.pngmas_makeConstraints方法在View的扩展的方法中,在方法中初始化了maker对象,将view传给maker中。maker的初始化方法中会保存view,并初始化一个数组保存约束。
然后调用了传入的block方法。
当调用make.left的方法时,会调用以下图中的方法
源码.png其实就是调用maker的constraint方法:
MasViewAttribute是约束属性,对象中保存了约束属性和view,对象中有判断约束是否相同的方法。
MASViewConstraint是视图约束,持有约束属性。
这时,如果constraint是nil的话,就设置constraint.delegate为maker。
这里会返回constraint对象。
如果再次调用.top时,其实调用的是MASViewConstraint的方法。
这里的self.delegate = maker;其实调用的还是maker的方法。核心方法。
上图核心方法中,会将这次约束和上次的约束方法数组中,生成组合视图约束对象。然后再将约束的代理设置为maker。返回组合约束对象。之后返回组合约束对象。
视图对象添加约束的方法如下,代理依旧是maker。这里用了MASConstraint对象,单个视图和组合视图都继承于该对象。
这里最后还是调用maker代理方法。
install 方法调用MASViewConstraint 的install方法,就是将系统约束添加到视图上。
源码.png 源码.png学习:
- 链式编程,可读性高,代码简洁,易维护。
- 面向对象:继承、封装、多态。
- 工厂模式
- delegate: 使用代理可以达到核心代码的重用。
网友评论