AutoLayout -Masonry

History and Something Insteresting

手写代码的UI的自动布局在iOS6中引入的新特性iOS 6 brings an awesome new feature to the iPhone and iPad: Auto Layout, 以取代之前的 autoresizingMask( “springs and struts” Model).

实际上关于纯手写代码UI Layout经历了三个时期,固定宽高(这个用frame设计非常容易),AutoresizingMask以及最新的Autolayout. 由于iphone6/6S发布后,苹果手机屏幕尺寸呈现多样性,所以Autolayout为APP开发提供了便捷的UI布局方案。

Masonry是一个轻量级的Layout框架,采用更自然的链式语法封装autolayout,同时支持iOS和Mac OS X.

Auto Layout 已经集成到Xcode5 + 版本的开发环境中,新建项目将默认开启Auto Layout.

Usage

  • Step1 将Masonry库添加到工程中
//编辑Podfile文件,添加(可以使用 pod search masonry 查询最新支持版本)
pod ‘Masonry‘, ‘~> 0.6.0‘

//然后, 在 Terminate 中输入如下命令
pod install
//或者
pod update
  • Step2 在程序文件中使用masonry对视图对象设置约束
//导入头文件:
#import <Masonry/Masonry.h>

// 在Cell中,对属性topBarrier设置Constraints, self.contentView是其父视图
// **注意 equalTo(<对象约束属性>), mas_equalTo(<Value值>)**
// 具体的一些属性含义,可以参加参考文献第一篇
[self.topBarrier mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.contentView).offset(5);
        make.left.equalTo(self.contentView.mas_left);
        make.width.equalTo(self.contentView.mas_width);
        make.height.mas_equalTo(@10);
}];

  • Step3 进阶:Masonry创建constraint定义Layout的三种方式
//1. mas_makeConstraints
// 为某个视图对象创建constraint,可以通过设置变量或属性来保存Constraint,并重复利用
// 如 picturesViewTop 这个MASConstraint 类型变量存储了constraint,下次可以复用
[self.picturesView mas_makeConstraints:^(MASConstraintMaker *make) {
       MASConstraint *picturesViewTop = make.top.equalTo(self.topBarrier.mas_bottom).offset(5);
       make.left.equalTo(self.topBarrier.mas_left);
       make.height.mas_equalTo(@(self.pictureHeight));
       make.width.mas_equalTo(@(self.pictureWidth));
}];

//2. mas_updateConstraints
// 更新某个视图对象的constraint,而非创建固定constraint
// 下面模拟使用场景
// 重写系统即 UIConstraintBasedLayoutCoreMethods 的 updateConstraints 方法
- (void)updateConstraints
{
    [self.pictureView mas_updateConstraints:^(MASConstraintMaker *make) {
        make.height.mas_equalTo(@(self.pictureHeight));
        make.width.mas_equalTo(@(self.pictureWidth));
    }];
    [super updateConstraints];
}
// 目的是通过高度和宽度属性(self.pictureHeight,self.pictureWidth)的变化来实现Constraints更新
// 在需要更新的地方添加如下代码, 则会更新相应约束,冲突的Constraints 以更新中的Constraints为准
self.pictureHeight = 100;
self.pictureWidth = 100;
[self setNeedsUpdateConstraints];
[self updateConstraints];

// 3. mas_remakeConstraints
// 和mas_updateConstraints 相似,都是更新Constraints,不同的是 mas_remakeConstraints 会删除之前的Constraints, 然后以新的Constraints 为准。

Important Methods for AutoLayout

  • 方法列表
Methods Function Usage
setNeedsUpdateConstraints 设置View需要更新约束
下次计算或者更新约束时会更新
在需要更新约束的时候调用
确保系统需要更新状态
updateConstraintsIfNeeded 立即触发约束更新,如果有约束要更新 系统调用 updateConstraints 方法
实现约束更新
setNeedsLayout 设置View页面需要更新,但不立即执行 在需要更新页面布局时调用
layoutIfNeeded 立即触发页面布局更新 系统重写布局时调用layoutSubviews 方法

- 方法总结

`setNeedsUpdateConstraints` 方法确保系统需要更新约束,系统再调用 `updateConstraintsIfNeeded` 时能确定调用 `updateConstraints` 达到立即更新约束的目的。如果不调用 `setNeedsUpdateConstraints` 且在View上没有约束变化,则系统不会调用 `updateConstraints`。

`setNeedsLayout` 和上述类似原理。

需要注意的是: 系统调用`layoutSubviews`时会调用`updateConstraintsIfNeeded`,通过更新约束,从superView 到 subView的层次顺序来计算frame,反向确定布局。
  • Auto Layout Process (自动布局流程)
Step 1 Update Constraints
布局的测量阶段,通过 setNeedsUpdateConstraints 触发

Step 2 layout
通过Step 1 的信息去设置View的 Center和Bounds,自上而下(from super view to subview)通过setNeedsLayout 触发

Step 3 display
把View渲染到屏幕,操作也是自上而下,通过 setNeedsDisplay触发

由于他们有依赖关系,即 update Constraints -> layout -> display, 因此 display 可能触发 layout, layout 可能触发 update Constraints

Issues

问题描述: 使用UITableView+FDTemplateLayoutCell实现Cell高度自适应计算,但在Cell中用Masonry定义的约束不严谨,即没有形成闭环,例如 最后约束的bottom没有加,则masonry计算布局出错,呈现的效果就是叠影。

// tableViewCell中定义的Masonry
    [self.commentBarrier mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.elfretweetedBackground.mas_bottom);
        make.width.equalTo(self.contentView.mas_width);
        make.height.mas_equalTo(@0.5);
    }];
    [self.commentBar mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.commentbarrier.mas_bottom).offset(5);
        make.width.equalTo(self.contentView.mas_width);
        make.height.mas_equalTo(@25);
        // ****** 注意约束闭环 ******
        make.bottom.equalTo(self.contentView.mas_bottom);
    }];

// TableViewController 中的TableView代理方法
#pragma mark - UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 使用 UITableView+FDTemplateLayoutCell
    return [tableView fd_heightForCellWithIdentifier:@"cellIdentifier" cacheByIndexPath:indexPath configuration:^(WeiBoContentTableViewCell *cell) {
    // cell 类型
        WeiBoDataStatus *status = self.statuses[indexPath.section][indexPath.row];
        [cell setupStatus:status];
    }];
}

References

masonry github

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

Beginning Auto Layout Tutorial in iOS 7: Part 1

Auto Layout Guide

iOS中AutoLayer自动布局流程及相关方法

AutoLayout:浅析动画

先进的自动布局工具箱

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-24 02:56:44

AutoLayout -Masonry的相关文章

【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

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

【转】有趣的Autolayout示例-Masonry实现

原文网址:http://tutuge.me/2015/05/23/autolayout-example-with-masonry/ 好久没有写Blog了,这段时间有点忙啊=.=本文举了3个比较有“特点”的Autolayout例子,源于微博上好友的提问,感觉比较有意思,也比较有代表性,就写了出来,分享给大家~至于为什么用Masonry,那是因为它好用啊!(被问到过有关Masonry的问题,就索性用它来实现吧=.=). 效果图 Github地址 https://github.com/zekunyan

代码方式使用AutoLayout (NSLayoutConstraint + Masonry)

随着iPhone6/6+设备的上市,如何让手头上的APP适配多种机型多种屏幕尺寸变得尤为迫切和必要.(包括:iPhone4/4s,iPhone5/5s,iPhone6/6s,iPhone 6p/6ps). 在iPhone6出现以前,我们接触的iPhone屏幕只有两种尺寸:320 x 480和320 x 568.所以在那个时候使用传统的绝对定位(Frame)方式进行界面控件的布局还是比较轻松的,因为我们只需要稍微调整一下Frame就可以适配这两种大小的屏幕了.也许这也是为什么虽然AutoLayou

IOS自适应库---- Masonry的使用

Masonry是一个轻量级的布局框架,拥有自己的描述语法,采用更优雅的链式语法封装自动布局,简洁明了并具有高可读性,而且同时支持 iOS 和 Max OS X.Masonry是一个用代码写iOS或OS界面的库,可以代替Auto layout.Masonry的github地址:https://github.com/SnapKit/Masonry 以下将从三个方面介绍 如下: - Masonry配置                   - Masonry使用                  - M

AutoLayout与Masonry

http://www.cocoachina.com/design/20160713/17032.html http://www.cocoachina.com/ios/20160616/16732.html http://www.cocoachina.com/ios/20141219/10702.html http://www.jianshu.com/p/f0b17ecfd04e http://www.cocoachina.com/ios/20150702/12217.html http://ad

IOS SizeClass 和 Autolayout 适配各种设备

现在苹果生态圈中的设备尺寸也已经变得种类繁多了,设备种类如下:iPad:iPad1,iPad2,newPad,iPad4,iPad air,iPad air2,iPad mini1,iPad mini2,iPad mini3,iPad pro;iPhone:iPhone3Gs,iPhone4,iPhone4S,iPhone5,iPhone5S,iPhone5C iPhone6,iPhone6 Plus,iPhone6S,ipad iPhone6S Plus;iWatch 屏幕大小: iPhone

Masonry 轻量级布局框架的使用

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