MASConstraintMaker
上一篇,我们了解了链式编程的基本思想,从这篇开始,我们通过Masonry来更深刻的理解链式编程思想。
先来看这个代码片,我们从mas_makeConstraints入手来深入源码的学习。
[yellowV mas_makeConstraints:^(MASConstraintMaker *make) {
/**
* 链式方法使用block()方法
* make.left返回值为maker,这样才能继续使用点语法
*/
make.left.top.right.bottom.equalTo(self.view).with.mas_offset(20);
}];
mas_makeConstraints
跳入mas_makeConstraints中,我们可以看到,这是一个分类。
#import "View+MASAdditions.h"
#import <objc/runtime.h>
@implementation MAS_VIEW (MASAdditions)
@end
思考:为什么使用分类,而不创建一个类来调用这个方法???
个人根据使用发现,设置为UIView分类的好处,我们需要布局的控件的父类追溯到都是UIView类型的,因此直接做成UIView的分类,就能够很好的不用实力化对象,直接使用UIView的分类方法就可以使用,使得开发更加便捷和有效。
分类中提供了三种常用的布局方式(设置布局约束 | 更新布局约束 | 重新设置布局约束):
- -(NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block;
- -(NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *))block;
- -(NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block;
三种方法都需要传入MASConstraintMaker布局管理者的block块。既然,三种方法大致相同,因此,我们只看第一个方法。
- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
self.translatesAutoresizingMaskIntoConstraints = NO;
MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
block(constraintMaker);
return [constraintMaker install];
}
这部分源码看起来很可爱(因为少)。
首先,系统设置布局时候也需要先取消自动布局方法,这一点和NSLayoutConstraints是相同的。
self.translatesAutoresizingMaskIntoConstraints = NO;
其次,创建一个MASConstraintMaker管理者对象然后丢到Block块中。
MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
block(constraintMaker);
(void(^)(MASConstraintMaker *))block
这个Block块返回值为空,需要传入的参数是MASConstraintMaker,Block的名称是block
最后,进行约束安装。
[constraintMaker install];
MASConstraintMaker
既然创建了MASConstraintMaker,我们先看看MASConstraintMaker具体是什么,功能是什么。
MASConstraintMaker一上来就定义了我们布局常用的成员属性,对于MASConstraint,我们稍后进行分析。
@property (nonatomic, strong, readonly) MASConstraint