iOS常用库之Masonry

简单介绍

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:0];

[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:系统重写布局

时间: 2024-11-03 03:36:26

iOS常用库之Masonry的相关文章

IOS常用第三方库《转》

UI 动画 网络相关 Model 其他 数据库 缓存处理 PDF 图像浏览及处理 摄像照相视频音频处理 响应式框架 消息相关 版本新API的Demo 代码安全与密码 测试及调试 AppleWatch VPN 完整项目 好的文章 Xcode插件 美工资源 其他资源 开发资源 UI 下拉刷新 EGOTableViewPullRefresh - 最早的下拉刷新控件. SVPullToRefresh - 下拉刷新控件. MJRefresh - 仅需一行代码就可以为UITableView或者Collect

IOS常用的第三方开发库

开发几个常用的开源类库及下载地址: 1.json json编码解码2.GTMBase64 base64编码解码3.TouchXML xml解析4.SFHFKeychainUtils 安全保存用户密码到keychain中5.MBProgressHUD 很棒的一个加载等待特效框架6.ASIHTTPRequest http等相关协议封装7.EGORefreshTableHeaderView 下拉刷新代码8.AsyncImageView 异步加载图片并缓存代码9.类似setting的竖立也分栏程序 10

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

1.FMDB https://github.com/ccgus/fmdb 2.ASIHTTPRequest https://github.com/paytronix/ASIHTTPRequest 3.AFNetWork https://github.com/AFNetworking/AFNetworking 4.MBProgressHUD https://github.com/jdg/MBProgressHUD 5.AsyncSocket https://github.com/roustem/A

一些 iOS 常用的第三方库

网络通信 AFNetworking 轻量级的通讯类库,使用非常简单.建议更新到最新版,前几天看新闻说之前有个逻辑性的 bug https://github.com/AFNetworking/AFNetworking MKNetworkKit 最近做的不错的一个通讯类库,具有 AFNetworking 和 ASIHTTPRequest双方的优点,甚至功能更丰富一些,但是本人还没有使用过. https://github.com/MugunthKumar/MKNetworkKit ASIHTTPReq

iOS常用网络库收集

一 ASIHttpRequest二 AFNetworking 三 AFDownloadRequestOperationA progressive download operation for AFNetworking. 四 MKNetworkKit Github地址:https://github.com/MugunthKumar/MKNetworkKit介绍文章:http://www.cnblogs.com/scorpiozj/p/3222803.html License:MIT License

iOS常用的第三方库GitHub地址

MJRefresh https://github.com/CoderMJLee/MJRefresh#期待 Facebook-POP https://github.com/facebook/pop /*********************************************/ 非iOS第三方库类 hexo-vno(构建静态页面) https://github.com/lenbo-ma/hexo-theme-vno < iOS 开发进阶>随书示例程序和勘误 https://gith

iOS第三方库汇总[转载]

iOS第三方库汇总[转载] 字数2179 阅读334 评论0 喜欢29 简介 此文用于总结,本人使用过或者收藏过的Github第三方类库,以便日后查阅,也便他人借鉴. 资料整理中不定期更新... 开源项目 CodeHub browse and maintain your GitHub repositories on any iOS device! Open-Source iOS Apps 开源iOS apps列表 APP相关 iVersion 提示版本更新 BonMot 字体相关的库,设置字体样

iOS 第三方库、插件、知名博客总结

用到的组件1.通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SDWebImage多个缩略图缓存组件 UICKeyChainStore存放用户账号密码组件 Reachability监测网络状态 DateTools友好化时间 MBProgressHUD一款提示框第三方库 MWPhotoBrowser一款简单的 iOS 照片浏览控件 CTAssetsPickerController一个选择器组件, 支持从用户的相片库选择多张照片和视频. QB

iOS 常用四种数据存储方式

iOS 常用四种数据存储方式 在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅, ,使得用户体验更好.下面介绍?一下数据保存的方式: 1.NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法.前?一个方法告诉系统怎么对对象进行编码,而后?一个方法则是告诉系统怎么对对象进行解码.例如对Possession对