Github

简要

自动布局最重要的是约束:UI元素间关系的数学表达式。约束包括尺寸、由优先级和阈值管理的相对位置。它们是添加剂,可能导致约束冲突 、约束不足造成布局无法确定 。这两种情况都会产生异常。

使用前:AutoLayout关于更新的几个方法的区别

  • setNeedsLayout:告知页面需要更新,但是不会立刻开始更新。执行后会立刻调用layoutSubviews。
  • layoutIfNeeded:告知页面布局立刻更新。所以一般都会和setNeedsLayout一起使用。如果希望立刻生成新的frame需要调用此方法,利用这点一般布局动画可以在更新布局后直接使用这个方法让动画生效。
  • layoutSubviews:系统重写布局
  • setNeedsUpdateConstraints:告知需要更新约束,但是不会立刻开始
  • updateConstraintsIfNeeded:告知立刻更新约束
  • updateConstraints:系统更新约束

使用

1. 基本使用

  • mas_makeConstraints:添加约束
  • mas_updateConstraints:更新约束、亦可添加新约束
  • mas_remakeConstraints:重置之前的约束

  • multipler属性表示约束值为约束对象的乘因数, dividedBy属性表示约束值为约束对象的除因数,可用于设置view的宽高比

    1. // 进行屏幕的适配的时候,往往需要根据屏幕宽度来适配一个相应的高度,在此推荐使用如下约束的方式来进行控件的适配
    2. [self.topView addSubview:self.topInnerView];
    3. [self.topInnerView mas_makeConstraints:^(MASConstraintMaker *make) {
    4. make.height.equalTo(self.topView.mas_height).dividedBy(3);
    5. make.width.and.height.lessThanOrEqualTo(self.topView);
    6. make.width.and.height.equalTo(self.topView).with.priorityLow();
    7. make.center.equalTo(self.topView);
    8. }];
  • priorityLow()设置约束优先级
  • #define MAS_SHORTHAND_GLOBALS使用全局宏定义,可以使equalTo等效于mas_equalTo
  • #define MAS_SHORTHAND使用全局宏定义, 可以在调用masonry方法的时候不使用mas_前缀
  1. // 这里注意到一个地方,就是当使用了这个全局宏定义之后,发现可以有个类`NSArray+MASAdditions.h`,看了之后发现可以
  2. self.buttonViews = @[ raiseButton, lowerButton, centerButton ];
  3. // 之后可以在updateConstraints 方法中
  4. - (void)updateConstraints {
  5. [self.buttonViews updateConstraints:^(MASConstraintMaker *make) {
  6. make.baseline.equalTo(self.mas_centerY).with.offset(self.offset);
  7. }];
  8. [super updateConstraints];
  9. }
  • 动态修改视图约束:

    1. // 创建视图约束
    2. [blueView mas_makeConstraints:^(MASConstraintMaker *make) {
    3. self.animatableConstraint = make.edges.equalTo(superview).insets(paddingInsets).priorityLow();
    4. ]];
    5. // 更改约束 (另一处方法中)
    6. UIEdgeInsets paddingInsets = UIEdgeInsetsMake(padding, padding, padding, padding);
    7. self.animatableConstraint.insets = paddingInsets
    8. [self layoutIfNeeded];
  • debug模式:
    1. // 对某个view添加key值
    2. greenView.mas_key = @"greenView";
    3. // 或者如下顺序
    4. MASAttachKeys(greenView, redView, blueView, superview);
    5. // 同样的对每条约束亦可以添加key
    6. make.height.greaterThanOrEqualTo(@5000).key(@"ConstantConstraint");
  • preferredMaxLayoutWidth: 多行label的约束问题
  1. // 已经确认好了位置
  2. // 在layoutSubviews中确认label的preferredMaxLayoutWidth值
  3. - (void)layoutSubviews {
  4. [super layoutSubviews];
  5. // 你必须在 [super layoutSubviews] 调用之后,longLabel的frame有值之后设置preferredMaxLayoutWidth
  6. self.longLabel.preferredMaxLayoutWidth = self.frame.size.width-100;
  7. // 设置preferredLayoutWidth后,需要重新布局
  8. [super layoutSubviews];
  9. }
  • scrollView使用约束的问题:原理通过一个contentView来约束scrollView的contentSize大小,也就是说以子控件的约束条件,来控制父视图的大小
  1. // 1. 控制scrollView大小(显示区域)
  2. [self.scrollView makeConstraints:^(MASConstraintMaker *make) {
  3. make.edges.equalTo(self.view);
  4. }];
  5. // 2. 添加一个contentView到scrollView,并且添加好约束条件
  6. [contentView makeConstraints:^(MASConstraintMaker *make) {
  7. make.edges.equalTo(self.scrollView);
  8. // 注意到此处的宽度约束条件,这个宽度的约束条件是比添加项
  9. make.width.equalTo(self.scrollView);
  10. }];
  11. // 3. 对contentView的子控件做好约束,达到可以控制contentView的大小
  • 新方法:2个或2个以上的控件等间隔排序
  1. /**
  2. * 多个控件固定间隔的等间隔排列,变化的是控件的长度或者宽度值
  3. *
  4. * @param axisType 轴线方向
  5. * @param fixedSpacing 间隔大小
  6. * @param leadSpacing 头部间隔
  7. * @param tailSpacing 尾部间隔
  8. */
  9. - (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType
  10. withFixedSpacing:(CGFloat)fixedSpacing l
  11. eadSpacing:(CGFloat)leadSpacing
  12. tailSpacing:(CGFloat)tailSpacing;
  13. /**
  14. * 多个固定大小的控件的等间隔排列,变化的是间隔的空隙
  15. *
  16. * @param axisType 轴线方向
  17. * @param fixedItemLength 每个控件的固定长度或者宽度值
  18. * @param leadSpacing 头部间隔
  19. * @param tailSpacing 尾部间隔
  20. */
  21. - (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType
  22. withFixedItemLength:(CGFloat)fixedItemLength
  23. leadSpacing:(CGFloat)leadSpacing
  24. tailSpacing:(CGFloat)tailSpacing;

使用方法很简单,因为它是NSArray的类扩展:

  1. // 创建水平排列图标 arr中放置了2个或连个以上的初始化后的控件
  2. // alongAxis 轴线方向 固定间隔 头部间隔 尾部间隔
  3. [arr mas_distributeViewsAlongAxis:MASAxisTypeHorizontal withFixedSpacing:20 leadSpacing:5 tailSpacing:5];
  4. [arr makeConstraints:^(MASConstraintMaker *make) {
  5. make.top.equalTo(@60);
  6. make.height.equalTo(@60);
  7. }];

2. 注意事项

  • 约束视图对象只有在被addSubview之后,才能给视图添加约束
  • 当你的所有约束都在 updateConstraints 内调用的时候,你就需要在此调用此方法,因为 updateConstraints方法是需要触发的
  1. // 调用在view 内部,而不是viewcontroller
  2. + (BOOL)requiresConstraintBasedLayout {
  3. return YES;
  4. }
  5. /**
  6. * 苹果推荐 约束 增加和修改 放在此方法种
  7. */
  8. - (void)updateConstraints {
  9. [self.growingButton updateConstraints:^(MASConstraintMaker *make) {
  10. make.center.equalTo(self);
  11. make.width.equalTo(@(self.buttonSize.width)).priorityLow();
  12. make.height.equalTo(@(self.buttonSize.height)).priorityLow();
  13. make.width.lessThanOrEqualTo(self);
  14. make.height.lessThanOrEqualTo(self);
  15. }];
  16. //最后记得回调super方法
  17. [super updateConstraints];
  18. }
  • 如果想要约束变换之后实现动画效果,则需要执行如下操作

    1. // 通知需要更新约束,但是不立即执行
    2. [self setNeedsUpdateConstraints];
    3. // 立即更新约束,以执行动态变换
    4. // update constraints now so we can animate the change
    5. [self updateConstraintsIfNeeded];
    6. // 执行动画效果, 设置动画时间
    7. [UIView animateWithDuration:0.4 animations:^{
    8. [self layoutIfNeeded];
    9. }];

Masonry库的使用的更多相关文章

  1. 玩转Masonry JS库来实现瀑布流Web效果

    工作项目中需要制作个Mobile上的Web App的展示,方便快捷访问和评价反馈.在展示页面能看到应用展示图,点击进入Web应用.我不是前端开发者,对HTML, CSS, JS这三剑客仅仅是略知一二. ...

  2. iOS,第三方库使用

    1.ASIHttpRequest网络请求库 2.MBProgressHUD指示层库 3.Toast+UIView提示库 4.SDWebImage图片缓存库 5.MGSwipeTableCell单元格侧 ...

  3. Masonry自动布局使用

    Masonry是一个轻量级的布局框架,采用更好的语法封装自动布局,它有自己的布局DSL.简洁明了并具有高可读性 而且同时支持 iOS 和 Max OS X. 下载 NSLayoutConstraint ...

  4. iOS开发-自动布局篇:史上最牛的自动布局教学!

    转载自:http://www.jianshu.com/p/f6cf9ef451d9 本文我们将提到: aotulayout(手码) VFL aotulayout(Xib) Masonry(第三方框架) ...

  5. iOS创建界面方法的讨论

    以前在入门的时候,找的入门书籍上编写的 demo 都是基于 Storyboards 拖界面的.后来接触公司项目,发现界面都是用纯代码去写复杂的 autoLayout 的.再然后,领导给我发了个 Mas ...

  6. 【View层】界面绘制

    [引用]:http://www.jianshu.com/p/c5fc8c6b967a [View层]IOS纯代码绘制界面(一) 字数2303 阅读385 评论2 喜欢16 IOS开发中界面绘制占据了绝 ...

  7. [Objective-C]用Block实现链式编程

    看这篇博客时最快让你上手ReactiveCocoa之基础篇看到作者介绍链式编程那一块,发现自己的钻研精神不足.想想自己使用链式编程也有段时间了,对,就是 Masonry 库.自己一直享受点语法带来的效 ...

  8. [iOS]创建界面方法的讨论

    以前在入门的时候,找的入门书籍上编写的 demo 都是基于 Storyboards 拖界面的.后来接触公司项目,发现界面都是用纯代码去写复杂的 autoLayout 的.再然后,领导给我发了个 Mas ...

  9. Solve Error: 'NSInvalidArgumentException', reason: '-[UITableView mas_makeConstraints:]: unrecognized selector sent to instance 0x7fa5c402fa00'

    下面是iOS开发用第三方库可能出现的错误,及其解决方法: 1. 'NSInvalidArgumentException', reason: '-[UITableView mas_makeConstra ...

随机推荐

  1. WEB学习-CSS行高、字体,链接的美化以及背景

    行高和字号 CSS中,所有的行,都有行高.盒模型的padding,绝对不是直接作用在文字上的,而是作用在“行”上的. 单行文本垂直居中 文本在行里面是居中 其中,行高:盒子高; 需要注意的是,这个小技 ...

  2. [AI开发]深度学习如何选择GPU?

    机器推理在深度学习的影响下,准确性越来越高.速度越来越快.深度学习对人工智能行业发展的贡献巨大,这得益于现阶段硬件计算能力的提升.互联网海量训练数据的出现.本篇文章主要介绍深度学习过程中如何选择合适的 ...

  3. 2012-2013 ACM-ICPC, NEERC, Central Subregional Contest

    A Hanoi Tower 递归 题意: 大家都很熟悉汉诺塔的递归程序,现在给你一个组合,询问你这个组合是否会出现在汉诺塔的递归过程中. 题解: 将汉诺塔的递归程序反过来思考,考虑当前最大的那个盘,我 ...

  4. Codeforces Gym - 101147G The Galactic Olympics

    Discription Altanie is a very large and strange country in Mars. People of Mars ages a lot. Some of ...

  5. CodeForces - 600F Edge coloring of bipartite graph

    Discription You are given an undirected bipartite graph without multiple edges. You should paint the ...

  6. mc

    Description 小C在MC里有n个牧场,自西向东呈一字形排列(自西向东用1-n编号),于是他就烦恼了:为了控制这n个牧场,他需要在某些牧场上面建立控制站, 每个牧场上只能建立一个控制站,每个控 ...

  7. Nginx图片防盗链的方式

    原文:http://www.open-open.com/code/view/1430750263460 location ~* \.(gif|jpg|jpeg|png|ico)$ { valid_re ...

  8. ubuntu允许mysql远程连接

    ubuntu允许mysql远程连接 第一步: vim /etc/MySQL/my.cnf找到bind-address = 127.0.0.1 注释掉这行,如:#bind-address = 127.0 ...

  9. Objective-C 协议(protocol)二

    我们前面提到了OOP的继承,我们说Objective-C不像C++可以有多重继承,Objective-C是单一继承的,如果想要做到一个类别同时拥有多种型别的能力,我们就可以通过协议来实现.Object ...

  10. electron 缓存目录 禁用缓存

    C:\Users\Administrator\AppData\Roaming\linksame // 禁用缓存 app.commandLine.appendSwitch("--disable ...