简单介绍

Masonry 源码地址:https://github.com/Masonry/Masonry
Masonry是一个轻量级的布局框架 拥有自己的描述语法 采用更优雅的链式语法封装自动布局 简洁明了 并具有高可读性 而且同时支持 iOS 和 Mac OS X。

```
pod 'Masonry'
```

使用Masonry需要导入头文件 `#import  “Masonry.h”`

 系统API vs Masonry

系统API

NSLayoutConstraint

```objective-c

NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:item attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:item2 attribute:NSLayoutAttributeBottom multiplier:1.0 constant:];

[self.view addSubview:topConstraint];

```

Masonry API

先来看一段官方的sample code来认识一下Masonry

```

[view1 mas_makeConstraints:^(MASConstraintMaker *make) {

    make.edges.equalTo(superView).with.insets(padding);
}];

```

看到block里面的那句话: `make edges
equalTo superview with insets`
通过链式的自然语言 就把view1给autolayout好了

是不是简单易懂

使用介绍

操作约束方法

Masonry 处理约束主要是`View+MASAdditions`,它是`UIView`的`类别`

```objective-c

// 添加约束
- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *make))block; // 更新约束, 如果更新不成功有可能该约束不存在
//只能修改约束的值,不能更改约束关系即不能更改核心公式中的两个item和两个property
- (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *make))block; // 重置约束 将原有约束全部删除 重新添加
- (NSArray *)mas_remakeConstraints:(void(^)(MASConstraintMaker *make))block;

```

MASConstraintMaker属性

Masonry中`MASConstraintMaker`约束对象的 `MASConstraint` 类型属性:

```objective-c

@property (nonatomic, strong, readonly) MASConstraint *left;
@property (nonatomic, strong, readonly) MASConstraint *top;
@property (nonatomic, strong, readonly) MASConstraint *right;
@property (nonatomic, strong, readonly) MASConstraint *bottom;
@property (nonatomic, strong, readonly) MASConstraint *leading;
@property (nonatomic, strong, readonly) MASConstraint *trailing;
@property (nonatomic, strong, readonly) MASConstraint *width;
@property (nonatomic, strong, readonly) MASConstraint *height;
@property (nonatomic, strong, readonly) MASConstraint *centerX;
@property (nonatomic, strong, readonly) MASConstraint *centerY;
@property (nonatomic, strong, readonly) MASConstraint *baseline;
@property (nonatomic, strong, readonly) MASConstraint *edges;
@property (nonatomic, strong, readonly) MASConstraint *size;
@property (nonatomic, strong, readonly) MASConstraint *center;

```


其中leading与left trailing与right 正常情况下是等价的 但是当一些布局是从右至左时(比如阿拉伯文?没有类似的经验) 则会对调 换句话说就是基本可以不理不用 用left和right就好了

Relation

在 `MASConstraint` 类别中有以下几个方法表示view与view之间关系

```objective-c
- (MASConstraint * (^)(id attr))mas_equalTo;
- (MASConstraint * (^)(id attr))mas_greaterThanOrEqualTo;
- (MASConstraint * (^)(id attr))mas_lessThanOrEqualTo;
```

以上Relation方法相关方法的调用都会返回MASConstraint对象

UIView的扩展属性

```objective-c

@property (nonatomic, strong, readonly) MASViewAttribute *mas_left;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_top;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_right;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_bottom;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_leading;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_trailing;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_width;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_height;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_centerX;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_centerY;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_baseline;


```

MASConstraint相关

```objective-c

// insets:在上左下右四个方向缩进
- (MASConstraint * (^)(MASEdgeInsets insets))insets; // sizeOffset:宽高的偏移量
- (MASConstraint * (^)(CGSize offset))sizeOffset; // centerOffset:中心点偏移量
- (MASConstraint * (^)(CGPoint offset))centerOffset; // offset:偏移量
- (MASConstraint * (^)(CGFloat offset))offset; // valueOffset:value形式的偏移量
- (MASConstraint * (^)(NSValue *value))valueOffset; // multipliedBy:添加约束核心公式中的multiplier
- (MASConstraint * (^)(CGFloat multiplier))multipliedBy; // priority:设置优先级
- (MASConstraint * (^)(MASLayoutPriority priority))priority; // priorityLow:优先级低
- (MASConstraint * (^)())priorityLow; // priorityMedium:优先级中
- (MASConstraint * (^)())priorityMedium; // priorityHigh:优先级高
- (MASConstraint * (^)())priorityHigh; // 表示约束关系的,返回block,后面支持MASViewAttribute, UIView, NSValue, NSArray等类型
- (MASConstraint * (^)(id attr))equalTo; - (MASConstraint * (^)(id attr))greaterThanOrEqualTo; - (MASConstraint * (^)(id attr))lessThanOrEqualTo; // 可选的语义属性,对代码没有影响,只是为了提高代码可读性
- (MASConstraint *)with;
- (MASConstraint *)and; - (MASConstraint *)left;
- (MASConstraint *)top;
- (MASConstraint *)right;
- (MASConstraint *)bottom;
- (MASConstraint *)leading;
- (MASConstraint *)trailing;
- (MASConstraint *)width;
- (MASConstraint *)height;
- (MASConstraint *)centerX;
- (MASConstraint *)centerY;
- (MASConstraint *)baseline;


```

两个简易宏

 为了增加代码的可读性这里有两个简化代码的宏:
   `#define MAS_SHORTHAND`:只要在导入Masonry主头文件之前定义这个宏, 那么以后在使用Masonry框架中的属性和方法的时候, 就可以省略 `mas_` 前缀
   `#define MAS_SHORTHAND_GLOBALS`:只要在导入Masonry主头文件之前定义这个宏,那么就可以让equalTo函数接收基本数据类型, 内部会对基本数据类型进行包装

***注意***:这两个宏如果想有效使用,必须要在添加`Masonry`头文件导入之前定义。

Masonry使用注意事项

1. view在使用masonry添加约束时,view必须已经添加到其父视图上了;
2. label设置换行时,需要设置宽度
3. 动画记得调用layoutIfNeeded
4. mas_makeConstraints 只负责新增约束。Masonry不能同时存在两条针对于同一对象的约束 否则会报错;
5. 在使用三目运算符时,注意不要使用基本数据类型
6. mas_updateConstraints 会更新在block中出现的约束的值,对于之前不存在的约束关系,不会加载
7. iOS7有两个很有用的属性,topLayoutGuide和bottomLayoutGuide,这个两个主要是方便获取UINavigationController和UITabBarController的头部视图区域最下边和底部视图区域的最上边;

AutoLayout关于更新的几个方法的区别

* setNeedsUpdateConstraints:告知约束系统需要更新约束,但是不会立刻开始
* updateConstraintsIfNeeded:告知立刻更新约束
* layoutIfNeeded:告知页面布局立刻更新。所以一般都会和setNeedsLayout一起使用。如果希望立刻生成新的frame需要调用此方法,利用这点一般布局动画可以在更新布局后直接使用这个方法让动画生效。
* updateConstraints:官方建议写添加、更新约束代码的地方,如果重写了此方法,需要在该方法末尾调用[super updateConstraints]
* setNeedsLayout:告知页面需要更新,但是不会立刻开始更新。执行后会立刻调用layoutSubviews。
* layoutSubviews:系统重写布局

iOS常用库之Masonry的更多相关文章

  1. ios 常用库

    SwiftHTTP       网络请求库 SwiftyJSON     json解析库 SnapKit          自动布局库 Kingfisher      图像加载库 WRCycleScr ...

  2. IOS常用第三方库《转》

    UI 动画 网络相关 Model 其他 数据库 缓存处理 PDF 图像浏览及处理 摄像照相视频音频处理 响应式框架 消息相关 版本新API的Demo 代码安全与密码 测试及调试 AppleWatch ...

  3. iOS常用第三方库大全,史上最全第三方库收集

    下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UITableVie ...

  4. ios常用第三方库git下载地址

    本文转载至 http://blog.csdn.net/cerastes/article/details/38348599 iOS第三方库下载常用git 1.FMDB https://github.co ...

  5. 【iOS系列】-iOS开发常用库文件总结

    这里是列举出得一部分,更多内容可参考https://github.com/darren90/Gather_iOS 码农周刊的总结 - 覆盖很广 调调的 - 很多开发相关内容都有体现 右滑返回的解决 - ...

  6. iOS常用的第三方库GitHub地址

    MJRefresh https://github.com/CoderMJLee/MJRefresh#期待 Facebook-POP https://github.com/facebook/pop /* ...

  7. 一些 iOS 常用的第三方库

    网络通信 AFNetworking 轻量级的通讯类库,使用非常简单.建议更新到最新版,前几天看新闻说之前有个逻辑性的 bug https://github.com/AFNetworking/AFNet ...

  8. iOS常用网络库收集

    一 ASIHttpRequest二 AFNetworking 三 AFDownloadRequestOperationA progressive download operation for AFNe ...

  9. iOS 常用三方类库整理

    iOS 常用三方类库整理 1:基于响应式编程思想的oc 地址:https://github.com/ReactiveCocoa/ReactiveCocoa 2:hud提示框 地址:https://gi ...

随机推荐

  1. [转]jquery getJSON 数据联动(采用序列化和反序列化获取数据) .

    <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">    ...

  2. SQLServer异步调用,批量复制

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. 北京易信软科信息技术有限公司 问卷调查管理系统V2.0

    北京易信软科信息技术有限公司 问卷调查管理系统V2.0 支持题目模板配置.题型模板配置.选项模板配置,报表查询功能配置 按月建表功能 运用java开发.velocity技术实现页面加载功能,高性能,高 ...

  4. 从 A/Looper: Could not create epoll instance. errno=24 错误浅谈解决各种 bug 的思路

    今天代码写着写着就莫名闪退了,手机也没有“程序停止运行”的提示,logcat也没有看到蓝色的调用栈log,这样的闪退最是蛋疼了,还好必现.复现几次之后,终于从logcat中看到了一行可疑的log: A ...

  5. 关于IE下用HTTPS无法下载/打开文件

    关于IE下用HTTPS无法下载/打开文件(ie8兼容模式下,ie7/ie6下有些问题.) http协议下运行正常,可以下载文件但放到https协议下就不好用一保存,IE提示:ie无法下载,请求站点不可 ...

  6. 0,SFDC 开发篇 - 开发框架和APEX语法

    1, 开发环境 Your Name | Developer Console | Debug | Open Execute Anonymous Window 输入hello world,并点击Excut ...

  7. 安装和使用elasticsearch

    环境: win7 64位  jdk1.8.0  elasticsearch2.3.3 在官网下载elasticsearch2.3.3:https://www.elastic.co/thank-you? ...

  8. 关于conky

  9. Ninject之旅之十:Ninject自定义提供者

    摘要 提供者是特殊的工厂类,Ninject使用它来实例化解析类型.任何时候我们绑定一个服务类型到一个组件,我们都隐式地关联那个服务类型到一个可以实例化那个组件的提供者.这个隐藏的提供者被称为Stand ...

  10. Vuejs使用笔记 --- component内部实现

    现在来系统地学习一下Vue(参考vue.js官方文档): Vue.js是一个构建数据驱动的web界面的库,其目标是实现响应的数据绑定和组合的试图组件. Vue.js拥抱数据驱动的视图概念,这意味着我们 ...