AutoLayout使用总结のMasonry

Masonry是Objective-C中用于简化AutoLayout的第三方框架,支持iOS和OS X。本文分析了Masonry的使用,包括mas_makeConstraints开始的约束构建、Constraint Maker Block、MASConstraintMaker及其方法。同时介绍了Masonry的链式语法,如make.left.equalTo(@80),以及安装、使用和注意事项。
摘要由CSDN通过智能技术生成

AutoLayout使用总结のMasonry



简介

Masonry是 Objective-C 中用于自动布局的第三方框架, 我们一般使用它来代替冗长, 繁琐的 AutoLayout 代码,它同时支持iOS和OS X。
Masonry是一种领域特定语言(DSL),为自动布局的所有功能提供便捷的方法,包括建立和修改约束、存取属性、设置优先级以及调试支持。
Masonry的安装推荐使用cocoa Pod方式。有关于pod的使用,将会在另一篇文章中进行说明。

分析

Masonry的使用还是相当简洁的

// CODE1
 [button mas_makeConstraints:^(MASConstraintMaker *make) {
    make.centerX.equalTo(self.view);
    make.top.equalTo(self.view).with.offset(40);
    make.width.equalTo(@185);
    make.height.equalTo(@38);
}];

上边这条代码实现的简要效果是将一个button的大小设置为185*38,居中并距页面顶部为40。而这个效果也可以很容易的从代码中看出,没错,这就是Masonry,是不是很简单?

从mas_makeConstraints:开始

// CODE2
// View+MASAdditions.h

- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block;

这个方法主要是用于约束的第一次构建,从CODE1我们可以看到它在block方法中实现了对调用该方法的的控件的约束。
与之相同的,也有用于更新重构的约束的分类方法:

// CODE3
// View+MASAdditions.h

- (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *make))block;//更新
- (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block;//重构

mas_makeConstraints 只负责新增约束 Autolayout不能同时存在两条针对于同一对象的约束 否则会报错
mas_updateConstraints 针对上面的情况 会更新在block中出现的约束 不会导致出现两个相同约束的情况
mas_remakeConstraints 则会清除之前的所有约束 仅保留最新的约束
三种函数善加利用 就可以应对各种情况了

Constraint Maker Block

我们以mas_makeConstraints: 方法为入口来分析一下 Masonry 以及类似的框架(SnapKit)是如何工作的. mas_makeConstraints: 方法位于 UIView 的分类 MASAdditions 中.

Provides constraint maker block and convience methods for creating MASViewAttribute which are view + NSLayoutAttribute pairs.

这个分类为我们提供一种非常便捷的方法来配置 MASConstraintMaker, 并为视图添加 mas_left mas_right 等属性.
这个方法的主要实现方法为:

// CODE4
// View+MASAdditions.m

- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
    self.translatesAutoresizingMaskIntoConstraints = NO;
    MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
    block(constraintMaker);
    return [constraintMaker install];
}

因为 Masonry 是封装的苹果的 AutoLayout 框架, 所以我们要在为视图添加约束前将translatesAutoresizingMaskIntoConstraints属性设置为 NO. 如果这个属性没有被正确设置, 那么视图的约束不会被成功添加.
在设置 translatesAutoresizingMaskIntoConstraints 属性之后,
- 我们会初始化一个 MASConstraintMaker 的实例.
- 然后将 maker 传入 block 配置其属性.
- 最后调用 maker 的 install 方法为视图添加约束.

MASConstraintMaker

MASConstraintMaker 为我们提供了工厂方法来创建 MASConstraint. 所有的约束都会被收集直到它们最后调用 install 方法添加到视图上.

Provides factory methods for creating MASConstraints. Constraints are collected until they are ready to be installed

在初始化 MASConstraintMaker 的实例时, 它会持有一个对应 view 的弱引用, 并初始化一个 constraints 的空可变数组用来之后配置属性时持有所有的约束.

//CODE5
// MASConstraintMaker.m

- (id)initWithView:(MAS_VIEW *)view {
    self = [super init];
    if (!self) return nil;

    self.view = view;
    self.constraints = NSMutableArray.new;

    return self;
}

这里的 MAS_VIEW 是一个宏, 是 UIView 的 alias.

// CODE6
// MASUtilities.h

#define MAS_VIEW UIView

Setup MASConstraintMaker

在调用 block(constraintMaker) 时, 实际上是对 constraintMaker 的配置.

// CODE7
make.centerX.equalTo(self.view);  
make.top.equalTo(self.view)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值