TMMasonryExtends 是一个 Masonry 扩展库,可以用它为视图显示和隐藏状态设置不同的约束。

封装这个库主要是为了解决视图显示、隐藏的时候引入的大量条件判断和约束变更的代码。

效果图:

预览图

示例代码

#import <TMMasonryExtends/TMMasonryExtends.h>

[self.imageView mas_makeConstraints:^(MASConstraintMaker *make) {
// self.imageView 隐藏时,顶部间距自动设置为 0
make.top.equalTo(self.btnToggle.mas_bottom).offset(50).tm_collapseWhenHidden(self.imageView);
// self.imageView 隐藏时,高度设置为 0
make.height.mas_equalTo(0).tm_installWhenHidden(self.imageView);
// self.imageView 显示时,高度设置为 120
make.height.mas_equalTo(120).tm_installWhenShow(self.imageView);
make.width.equalTo(self.imageView.mas_height);
make.centerX.mas_offset(0);
}];

Usage

引入头文件

#import <TMMasonryExtends/TMMasonryExtends.h>

Masonry 扩展接口

@interface MASConstraint (TMExtends)

/**
view 隐藏时自动将约束值设置为 0,显示时恢复原值
*/
- (MASConstraint * (^)(UIView *view))tm_collapseWhenHidden;

/**
view 隐藏时安装此约束,反之卸载
*/
- (MASConstraint * (^)(UIView *view))tm_installWhenHidden;

/**
view 显示时安装此约束,反之卸载
*/
- (MASConstraint * (^)(UIView *view))tm_installWhenShow;

@end

Installation

TMMasonryExtends is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod 'TMMasonryExtends', '~> 1.0'

Requirements

iOS 8.0

Other

唠叨的记录放到后面来说吧,不感兴趣的小伙伴可以 Pass。

像文章开头提到的,封装这个库主要是为了解决视图显示、隐藏时,引入了大量条件判断和约束变更的代码,不利于代码日常维护。写过相对复杂视图的小伙伴,应该会同意这个观点。这个问题并不是使用 Masonry 进行视图布局带来的,而是使用约束布局必然要面对的问题。

迫切的需要TMMasonryExtends,是因为换工作以后,新项目组使用 Masonry 管理布局,而且在刷新 UI 时,有大量的条件判断和代码分支,维护起来实在头疼。

TMMasonryExtends最初的灵感来源于 UIView-FDCollapsibleConstraints,它针对 xib 布局提供了自动折叠约束的功能。之前工作的时候使用 xib 开发部分功能,那时候觉得这个很酷、很方便,不过使用过一段时间,总觉得缺了点什么。因此在开发TMMasonryExtends时,除了支持自动折叠约束值,还支持针对 view 显式/隐藏状态设置不同的约束。

TMMasonryExtends的第一个版本也因为受 UIView-FDCollapsibleConstraints 的设计影响,虽然实现的结果一样,但是对外的接口并不是这样,跟 UIView-FDCollapsibleConstraints 差不多,也是记录需要变更的约束,在需要的时候自动处理变更。在实际使用时,发现经常需要定义额外的 MasConstraint 变量,也不够Masonry化,因此重新设计了现在的接口。理想状态下,我们希望是设计好了再下手,现实总是需要我们走一些弯路,自己挖下的坑要自己填呀,又花了不少时间修改项目代码。

办法总比问题多,关键是要能发现问题,并解决问题,实在搞不定,抛出问题也行呀。