1.Masonry的基本API

mas_makeConstraints() // 添加约束

mas_remakeConstraints() //移除之前的约束,重新添加新的约束

mas_updateConstraints() //更新约束

equalTo() // 参数是对象类型,一般是视图对象或者mas_width这样的坐标系对象

mas_equalTo() //和上面功能相同,参数可以传递基础数据类型对象,可以理解为比上面的API更强大

width() //用来表示宽度,例如代表view的宽度

mas_width() //用来获取宽度的值。和上面的区别在于,一个代表某个坐标系对象,一个用来获取坐标系对象的值

上面例如equalTo或者width这样的,有时候需要涉及到使用mas_前缀,注意区分。

//控件左边 = 参考控件的右边 + 偏移值(10) (控件在参考控件的右边,距离其5px)

make.left.equalTo(view.superview.mas_right).offset(10);//不填则默认对应left,其他同理

注意:masequalTo 和 equalTo 区别:masequalTo 比equalTo多了类型转换操作,一般来说,大多数时候两个方法都是通用的,但是对于数值元素使用mas_equalTo。对于对象或是多个属性的处理,使用equalTo。特别是多个属性时,必须使用equalTo,例如make.left.and.right.equalTo(self.view);

注意:在循环cell,如果有代码重复调用的地方,一定要使用mas_remakeConstraints,以此防止循环的时候生成相同的约束,影响性能,甚至,能使用make的地方基本都可以用remake进行代替,防止生成无谓的约束

2.关于更新约束布局相关的API

- (void)updateConstraintsIfNeeded //调用此方法,如果有标记为需要重新布局的约束,则立即进行重新布局,内部会调用updateConstraints方法

- (void)updateConstraints //重写此方法,内部实现自定义布局过程

- (BOOL)needsUpdateConstraints //当前是否需要重新布局,内部会判断当前有没有被标记的约束

- (void)setNeedsUpdateConstraints //标记需要进行重新布局

3.Masonry的属性

@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;

注意:其中leading与left trailing与right 在正常情况下是等价的 但是当一些布局是从右至左时,则会对调 换句话说就是基本不用, 用left和right就好了。用leading/trailing 后就不要用left/right,如果混用会出现崩溃。

4.Masonry的简单使用

<1>.简单示例

UIView *view = [[UIView alloc] init];

view.backgroundColor = [UIColor redColor];

//一定要先加入父控件,否则报错

[self.view addSubview:view];

[view mas_makeConstraints:^(MASConstraintMaker *make) {

make.edges.equalTo(view.superview).insets(UIEdgeInsetsMake(20, 20, 20, 20));

}];

等价代码

[view mas_makeConstraints:^(MASConstraintMaker *make) {

make.left.right.top.bottom.equalTo(view.superview).insets(UIEdgeInsetsMake(20, 20, 20, 20));

}];

等价代码

[view mas_makeConstraints:^(MASConstraintMaker *make) {

make.left.equalTo(view.superview).offset(20);

make.top.equalTo(view.superview).offset(20);

make.right.equalTo(view.superview).offset(-20);

make.bottom.equalTo(view.superview).offset(-20);

}];

注意:链式语法中,and 以及 with都是修饰性语句,不做任何事情,只是便于理解。

<2>.关于multipliedBy的使用

//自视图的宽高是父视图一半

[view mas_makeConstraints:^(MASConstraintMaker *make) {

make.left.equalTo(view.superview);

make.top.equalTo(view.superview).offset(20);

make.width.height.equalTo(view.superview).multipliedBy(0.5);

}];

<3>.关于greaterThanOrEqualTo/lessThanOrEqualTo的使用

//宽大于等于200

make.width.greaterThanOrEqualTo(@200);

//宽小于等于200

make.width.lessThanOrEqualTo(@400)

<4>修改指定约束

MASConstraint *topConstraint;

// 在生成约束的时候

[view1 mas_makeConstraints:^(MASConstraintMaker *make) {

topConstraint = make.top.equalTo(superview.mas_top);

make.left.equalTo(superview.mas_left);

}];

// 在之后进行对该约束 进行修改

[topConstraint uninstall];

//blcok中进行判断使用约束(在统一处理某些业务的时候)

[self.button mas_remakeConstraints:^(MASConstraintMaker *make) {

make.size.equalTo(self.buttonSize);

if (topLeft) {

make.top.and.left.offset(10);

} else {

make.bottom.and.right.offset(-10);

}

}];

<5>固定宽高

//固定宽高300*300

[view mas_makeConstraints:^(MASConstraintMaker *make) {

make.center.equalTo(view.superview);

make.width.height.equalTo(@300);

}];

<6>关于mas_equalTo/mas_offset()使用

//高度为300的约束中,可以这样子写

mak.height.equalTo(@300);

//也可以,使用mas_equalTo,一般情况下,使用mas_equalTo来处理基本数据类型的封装

mak.height.mas_equalTo(300);

如果想使用基础数据类型当做参数,Masonry为我们提供了"mas_xx"格式的宏定义。

这些宏定义会将传入的基础数据类型转换为NSNumber类型,这个过程叫做封箱(Auto Boxing)。

"mas_xx"开头的宏定义,内部都是通过MASBoxValue()函数实现的。

这样的宏定义主要有四个,分别是mas_equalTo()、mas_offset()和大于等于、小于等于四个。

mas_equalTo其实是多了一层处理的宏而已,因为equalTo并不支持基本数据类型

#define mas_equalTo(...) equalTo(MASBoxValue((__VA_ARGS__)))

<7>多个视图的等高、等宽、左对齐、下对齐等的约束

// 表达三个视图等高的约束.

make.height.equalTo(@[view1.mas_height, view2.mas_height]);

make.height.equalTo(@[view1, view2]);

make.left.equalTo(@[view1, @100, view3.right]);

<8>动画问题

//动画问题,和普通的方法实现差不多,重点只是修改约束后调用

[view.superview layoutIfNeeded];

[view mas_makeConstraints:^(MASConstraintMaker *make) {

make.top.mas_equalTo(400);

make.left.mas_equalTo(100);

make.size.mas_equalTo(CGSizeMake(100, 100));

}];

//如果其约束还没有生成的时候需要动画的话,就请先强制刷新后才写动画,否则所有没生成的约束会直接跑动画

[view.superview layoutIfNeeded];

[UIView animateWithDuration:3 animations:^{

[view mas_updateConstraints:^(MASConstraintMaker *make) {

make.left.mas_equalTo(200);

}];

[view.superview layoutIfNeeded];//强制绘制

}];

<9>设置约束优先级

Masonry为我们提供了三个默认的方法,priorityLow()、priorityMedium()、priorityHigh(),这三个方法内部对应着不同的默认优先级。

除了这三个方法,我们也可以自己设置优先级的值,可以通过priority()方法来设置。

[self.redView mas_makeConstraints:^(MASConstraintMaker *make) {

make.center.equalTo(self.view); make.width.equalTo(self.view).priorityLow();

make.width.mas_equalTo(20).priorityHigh();

make.height.equalTo(self.view).priority(200);

make.height.mas_equalTo(100).priority(1000);

}];

Masonry也帮我们定义好了一些默认的优先级常量,分别对应着不同的数值,优先级最大数值是1000。

static const MASLayoutPriority MASLayoutPriorityRequired = UILayoutPriorityRequired;

static const MASLayoutPriority MASLayoutPriorityDefaultHigh = UILayoutPriorityDefaultHigh;

static const MASLayoutPriority MASLayoutPriorityDefaultMedium = 500;

static const MASLayoutPriority MASLayoutPriorityDefaultLow = UILayoutPriorityDefaultLow;

static const MASLayoutPriority MASLayoutPriorityFittingSizeLevel = UILayoutPriorityFittingSizeLevel;

5.Masonry的注意事项

<1> 使用 mas_makeConstraints方法的元素必须事先添加到父元素的中,例如

[self.view addSubview:view];

<2> multipliedBy的使用只能是设置同一个控件的,比如这里的bottomInnerView,

make.height.mas_equalTo(bottomInnerView.mas_width).multipliedBy(3);

<3> 对label约束必须设置最大约束的宽度

self.titleLabel.preferredMaxLayoutWidth = w - 100 - 15;

<4> contentView的冲突

如果遇到和contentView的冲突,基本原因是因为cell的content view有一个系统的约束(高度),而masonry是不会去管理非自己产生的约束,因此在使用label imageview等情况下,增加以下属性设置,确保优先级以防止冲突

[_contentLabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];

6.Masonry使用问题、修改冲突

当约束冲突发生的时候,我们可以设置view的key来定位是哪个

viewredView.mas_key =@"redView";greenView.mas_key = @"greenView";blueView.mas_key = @"blueView";

若是觉得这样一个个设置比较繁琐,怎么办呢,Masonry则提供了批量设置的宏

MASAttachKeysMASAttachKeys(redView,greenView,blueView); //一句代码即可全部设置。

如果出现什么疑难杂症的话,基本都是AutoLayout在iOS的不适用,所以搜索问题的话,各位直接搜索Autolayout 关键字便可,不必搜索Masonry的问题。

ios怎么引入masonry_iOS-Masonry的简单使用相关推荐

  1. ios怎么引入masonry_IOS Masonry的基本使用

    Masonry是一个轻量级的布局框架,拥有自己的描述语法,采用更优雅的链式语法封装自动布局,简洁明了并具有高可读性,而且同时支持 iOS 和 Max OS X.Masonry是一个用代码写iOS或OS ...

  2. ios怎么引入masonry_iOS Masonry详解

    现在iPhone手机屏幕越来越多, 屏幕适配也越来越重要. Masonry就是为屏幕适配而生的三方框架. Masonry基础API mas_makeConstraints() 添加约束 mas_rem ...

  3. ios怎么引入masonry_ios masonry 怎样设置边距自适应

    方法1:获取webview中scrovllview的contentsize进行设置 -(void)webViewDidFinishLoad:(UIWebView *)webView{ CGFloat ...

  4. ios怎么引入masonry_iOS自动布局——Masonry详解

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:oceanlong | 腾讯 移动客户端开发工程师 前言 UI布局是整个前端体系里不可或缺的一环.代码的布局是设计语言与用户视觉感受沟 ...

  5. ios怎么引入masonry_iOS开发-Masonry简易教程

    关于iOS布局自动iPhone6之后就是AutoLayOut,AutoLayOut固然非常好用,不过有时候我们需要在页面手动进行页面布局,VFL算是一种选择,如果对VFL不是很熟悉可以参考iOS开发- ...

  6. ios怎么引入masonry_详解 iOS 自动布局框架 Masonry

    集成方式 Masonry支持CocoaPods,可以直接通过podfile文件进行集成,需要在CocoaPods中添加下面代码: pod 'Masonry' Masonry 学习建议 在 UI 开发中 ...

  7. Flutter-现有iOS工程引入Flutter

    前言 Flutter 是一个很有潜力的框架,但是目前使用Flutter的APP并不算很多,相关资料并不丰富,介绍现有工程引入Flutter的相关文章也比较少.项目从零开始,引入Flutter操作比较简 ...

  8. ​iPhone 13发布时间曝光;中国博士创造新算法,提高步态精确识别身份的精度;iOS 15引入半身照的人物识别功能|极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  9. iOS开发之百度地图的简单集成——标注POI检索

    iOS开发之百度地图的简单集成--标注&POI检索 .h文件 // Created by XK_Recollection on 16/6/15. // Copyright © 2016年 GN ...

  10. iOS开发针对对Masonry下的FPS优化讨论

    今天博客的内容就系统的讨论一下Masonry对FSP的影响,以及如何更好的使用Masonry.如果你对iOS开发足够熟悉的话,那么对Masonry框架应该不陌生.简单的说,Masonry的诞生让Aut ...

最新文章

  1. Android文件的下载
  2. 最小公倍数(Least Common Multiple)
  3. 人类应鼎力进行探索的35种颠覆性技术
  4. JAVA关于字符串字符数组处理的小题目
  5. java lo流_javaIO:字节流
  6. 电脑摄像头未能创建连接服务器,Win7中摄像头提示未能创建视频预览错误怎么办...
  7. Python实现GCS bucket断点续传功能,分块上传文件
  8. Hive分区过多有何坏处以及分区时的注意事项
  9. 新iPhone机模曝光:依旧三款配色 难有渐变机身
  10. 《黑客秘笈——渗透测试实用指南(第2版)》—第1章1.6学习
  11. (转)SegWit 与 Lightning Network
  12. 强强联合!蚂蚁金服与新炬网络战略合作,共同致力于国产数据库的技术推广和生态建设
  13. WinCE下Touch Panel驱动介绍 .
  14. 【STM32H7教程】第2章 STM32H7的开发环境搭建
  15. C++模板(函数模板/类模板)
  16. 网络原理考试到ADSL上网原理
  17. BBU与RRU、RRH
  18. 移动体验大作战,冰桶算法全盘点
  19. Android N Idle模式分析
  20. keras UserWarning: Discrepancy between trainable weights and collected trainable weigh...

热门文章

  1. 董耀祖:云原生是趋势,多云、边缘云也变得很热
  2. 2020年勒索病毒事件盘点及未来发展趋势
  3. 云南公安云计算平台项目获中国优秀云计算开源案例特等奖
  4. 【单目标优化求解】基于matlab非线性权重的自适应鲸鱼算法求解单目标优化问题(NWAWOA)【含Matlab源码 1665期】
  5. 【路径规划】基于matlab蚁群算法求解机器人栅格地图最短路径规划问题【含Matlab源码 1580期】
  6. 离散数学期末复习概念_复习第1部分中的基本概念
  7. 蒙特卡洛方法习题_蒙特卡洛方法
  8. Pytorch:GPU版代码改成CPU版(RuntimeError: torch.cuda.FloatTensor is not enabled.)
  9. 动态代理的两种方式_一文帮你掌握Java中的动态代理
  10. 笔记本linux版刚买回来怎么检查,新电脑买回来要怎么做