Masonry~(转)

http://www.cnblogs.com/xyzaijing/p/4049169.html

Masonry是一个轻量级的封装了Autolayout框架

https://github.com/Masonry/Masonry

github页面上给出了使用Masonry和Autolayout实现同样效果代码量的对比

当然了你如果学习了VFL,代码量也不会很多

?

平常我们使用Autolayout要设置view.translatesAutoresizingMaskIntoConstraints = NO;

Masonry会自动帮我们调用这行代码

?

结合官方的实例看几个小时差不多就能使用Masonry了,

UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);
[view1 mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(superview.mas_top).with.offset(padding.top); //with is an optional semantic filler
 make.left.equalTo(superview.mas_left).with.offset(padding.left); make.bottom.equalTo(superview.mas_bottom).with.offset(-padding.bottom); make.right.equalTo(superview.mas_right).with.offset(-padding.right); }];

让一个在父视图上上下左右各缩进10个长度(请自动脑补如果使用Autolayout的代码量)

下面是效果图

?

或者你可以用一行代码搞定上面的效果图

[view1 mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(superview).with.insets(padding); }];

?

?

肿么样,给力吧

除了可以使用make.edges还可以使用make.size等,直接设置size约束

?

Masonry还会自动识别你要设置的属性(上,下,左,右),下面两行代码的效果等价

make.left.greaterThanOrEqualTo(label); make.left.greaterThanOrEqualTo(label.mas_left);

?

下面是宽度约束的代码

make.width.greaterThanOrEqualTo(@200); make.width.lessThanOrEqualTo(@400)

?

然而,Autolayout不允许对齐元素(left ,centerX)等写成常量 ,所以如果你写成下面那句代码

make.left.lessThanOrEqualTo(@10)

Masonry会自动帮你转换为下面的约束式(关联superView)

view.left = view.superview.left + 10

?

你出了可以使用NSNumber,还可以使用基本类型量和结构体(最下面那句代码是多次设置)

make.top.mas_equalTo(42); make.height.mas_equalTo(20); make.size.mas_equalTo(CGSizeMake(50, 100)); make.edges.mas_equalTo(UIEdgeInsetsMake(10, 0, 10, 0)); make.left.mas_equalTo(view).mas_offset(UIEdgeInsetsMake(10, 0, 10, 0));

此外你还可以添加NSArray(一组)约束

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

?

还可以一次添加多个约束,使用链式语句或者结构体

Masonry also gives you a few convenience methods which create multiple constraints at the same time. These are called MASCompositeConstraints edges // make top, left, bottom, right equal view2
make.edges.equalTo(view2); // make top = superview.top + 5, left = superview.left + 10, // bottom = superview.bottom - 15, right = superview.right - 20
make.edges.equalTo(superview).insets(UIEdgeInsetsMake(5, 10, 15, 20)) size // make width and height greater than or equal to titleLabel
make.size.greaterThanOrEqualTo(titleLabel) // make width = superview.width + 100, height = superview.height - 50
make.size.equalTo(superview).sizeOffset(CGSizeMake(100, -50)) center // make centerX and centerY = button1
make.center.equalTo(button1) // make centerX = superview.centerX - 5, centerY = superview.centerY + 10
make.center.equalTo(superview).centerOffset(CGPointMake(-5, 10)) You can chain view attributes for increased readability: // All edges but the top should equal those of the superview
make.left.right.and.bottom.equalTo(superview); make.top.equalTo(otherView);

?

你还可以定义约束的优先级,当约束出现冲突的时候,优先级高的约束覆盖优先级低的约束(下面的代码是添加优先级)

make.left.greaterThanOrEqualTo(label.mas_left).with.priorityLow(); make.top.equalTo(label.mas_top).with.priority(600);

?

有时候我们需要去掉某些约束,或者修改某些约束(动画等),这个时候肿么办呢?

// in public/private interface
@property (nonatomic, strong) MASConstraint *topConstraint; ... // when making constraints
[view1 mas_makeConstraints:^(MASConstraintMaker *make) { self.topConstraint = make.top.equalTo(superview.mas_top).with.offset(padding.top); make.left.equalTo(superview.mas_left).with.offset(padding.left); }]; ... // then later you can call
[self.topConstraint uninstall];

使用一个引用,在不需要的时候,调用uninstall就可以去掉约束了

?

如果你后续需要改变约束(添加动画等),你可以调用另外一个创建约束的方法,并把约束需要的值,写成变量(苹果建议添加个更新约束写在updateConstraints方法中)

// this is Apple‘s recommended place for adding/updating constraints // this method can get called multiple times in response to setNeedsUpdateConstraints // which can be called by UIKit internally or in your code if you need to trigger an update to your constraints
- (void)updateConstraints { [self.growingButton mas_updateConstraints:^(MASConstraintMaker *make) { make.center.equalTo(self); make.width.equalTo(@(self.buttonSize.width)).priorityLow(); make.height.equalTo(@(self.buttonSize.height)).priorityLow(); make.width.lessThanOrEqualTo(self); make.height.lessThanOrEqualTo(self); }]; //according to apple super should be called at end of method
 [super updateConstraints]; }

?

有时候我们为了改变约束,需要有变量来引用约束,这个时候如果需要改变的约束非常多,那么这将是一个非常蛋疼的代码量

所以Masonry提供了一个重建约束的方法,使用这个方法,建立约束之前会把之前的约束全部清除掉,然后重新添加,这样我们只需要添加执行逻辑代码就行了(判断等)

如下

mas_updateConstraints is useful for updating a set of constraints, but doing anything beyond updating constant values can get exhausting. That‘s where mas_remakeConstraints comes in.
 mas_remakeConstraints is similar to mas_updateConstraints, but instead of updating constant values, it will remove all of its contraints before installing them again. This lets you provide different constraints without having to keep around references to ones which you want to remove. - (void)changeButtonPosition { [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); } }]; }

?

约束出现问题的时候控制台打印的信息过于笼统,不容易让人发现问题,为此Masonry,添加了分类,重写了约束的description方法

从而可以给出更详细的提示信息

?

Masonry adds a category to NSLayoutConstraint which overrides the default implementation of - (NSString *)description. Now you can give meaningful names to views and constraints, and also easily pick out the constraints created by Masonry.

?

Masonry还给出了snippets

Copy the included code snippets to ~/Library/Developer/Xcode/UserData/CodeSnippets to write your masonry blocks at lightning speed! mas_make -> [<view> mas_makeConstraints:^(MASConstraintMaker *make){<code>}]; mas_update -> [<view> mas_updateConstraints:^(MASConstraintMaker *make){<code>}]; mas_remake -> [<view> mas_remakeConstraints:^(MASConstraintMaker *make){<code>}];

?

时间: 2024-10-13 11:47:54

Masonry~(转)的相关文章

Masonry整理

Masonry整理 Masonry是以AutoLayout为基础的轻量级布局框架更加简化了整个约束系统 Masonry三方下载本文参考:    地址1    地址2    地址3    地址4 *Masonry有哪些属性 @property (nonatomic, strong, readonly) MASConstraint left;@property (nonatomic, strong, readonly) MASConstraint top;@property (nonatomic,

Masonry介绍与使用实践:快速上手Autolayout

以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时代 window的size固定为(320,480) 我们只需要简单计算一下相对位置就好了 在iphone4-iphone4s时代 苹果推出了retina屏 但是给了码农们非常大的福利:window的size不变 在iphone5-iphone5s时代 window的size变了(320,568) 这时autoresizingMask派上了用场(为啥这时候不用Autolayout? 因为还要支持ios5呗) 简单

Masonry 轻量级布局框架的使用

iOS 提供了自动布局的方法,但是原生的方法使用太过麻烦 ,Masonry 框架提供了类似的方法,同样可以实现自动布局 ,代码更加直观,而且容易理解. Masonry 是一个轻量级的布局框架.拥有自己的描述语法,采用更优雅的链式语法封装自动布局,简洁明了并具有较高的可读性 ,同时支持iOS和Mac OSX.某种意义上可以取代AutoLayout 1.Masonry配置 使用时只需要导入头文件 (Masonry.h) 2.Masonry 常用的方法 2.1Masonry 给视图添加布局条件的常用方

Masonry应用【美图秀秀首页界面自动布局】

Masonry在此实现时候,并没有比NSLayoutConstraint简单,相反我觉得还不如NSLayoutConstraint. [self.topView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.view.mas_top); make.right.equalTo(self.view.mas_right).with.offset(-6); make.width.equalTo(@51);

iOS — Autolayout之Masonry解读

前言 1 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时代 window的size固定为(320,480) 我们只需要简单计算一下相对位置就好了 在iphone4-iphone4s时代 苹果推出了retina屏 但是给了码农们非常大的福利:window的size不变 在iphone5-iphone5s时代 window的size变了(320,568) 这时auto

使用第三方框架 Masonry 实现自动布局

使用第三方框架 Masonry 实现自动布局 时间:2015-02-10 11:08:41      阅读:4595      评论:0      收藏:0      [点我收藏+] 由于前两天都在学习自动布局的使用,但是又觉得苹果原生的方式太过于麻烦,而且也不易于理解,昨天听人说了有个第三方框架也可以实现自动布局的功能,然后在https://github.com/上找到了Mansonry这个框架,使用起来真的减少了很多时间,而且代码直观,更加容易理解. 送上源码地址:https://githu

【IOS】AutoLayout框架Masonry

AutoLayout框架Masonry https://github.com/SnapKit/Masonryhttp://archerzz.ninja/ios/masonry-code.htmlhttp://www.cocoachina.com/ios/20141219/10702.htmlhttp://www.starming.com/index.php?v=index&view=81&utm_source=tuicool&utm_medium=referral http://s

AutoLayout框架Masonry使用心得

AutoLayout框架Masonry使用心得 AutoLayout的一些基本概念 利用约束来控制视图的大小和位置,系统会在运行时通过设置的约束计算得到frame再绘制屏幕 两个属性Content Compression Resistance(排挤,值越高越固定)和Content Hugging(拥抱),Masonry代码如下 //content hugging 为1000 [view setContentHuggingPriority:UILayoutPriorityRequired forA

masonry 使用笔记

Masonry的使用,动画,出现问题解决等 经过一点时间的使用,发现在网上很少有Masonry的教程,也仅仅有那么一两篇而已,在此我编写一下我最近一段时间使用的方法,供大家学习. Masonry是AutoLayout的一个第三方类库,用链式语法封装了冗长的AutoLayout代码,因此学习成本相对于官方提供的AutoLayout,以及VFL语言而言,低上很多很多... 准备 在GitHub上 https://github.com/SnapKit/Masonry 下载配置第三方库,基本使用方法在R

&lt;转&gt;iOS常用第三方库之Masonry

一.前言 关于苹果的布局一直是我比较纠结的问题,是写代码来控制布局,还是使用storyboard来控制布局呢?以前我个人开发的时候很少使用代码去写约束,因为太麻烦了.所以最终选择的都是AutoLayout进行布局,然后拖线设置约束.不过好多公司进行iOS开发的时候都会去动态的修改约束,而且有的会使用约束去创建一些动画,所以不太去用storyboard进行开发(还有就是使用storyboard几个人合作的时候比较麻烦).反倒更多的是写代码开发看起来更加的高效.所以好多开发者都开始去使用Masonr