Masonry布局源码精讲(二) -- MASConstraintMaker

本文深入探讨Masonry布局框架中的MASConstraintMaker和MASConstraintMaker,分析mas_makeConstraints等方法,讲解分类使用的原因,以及布局管理器的创建、约束安装过程。通过对源码的解读,理解Masonry如何实现链式编程和布局操作。
摘要由CSDN通过智能技术生成

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的分类方法就可以使用,使得开发更加便捷和有效。

分类中提供了三种常用的布局方式(设置布局约束 | 更新布局约束 | 重新设置布局约束):

  1. -(NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block;
  2. -(NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *))block;
  3. -(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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值