iOS-masonary布局

Masonry -- 使用纯代码进行iOS应用的autolayout自适应布局 简介简化iOS应用使用纯代码机型自适应布局的工作,使用一种简洁高效的语法替代NSLayoutConstraints. 项目主页: Masonry 最新示例: 点击下载 项目简议: 如果再看到关于纯代码,xib或storyboard,使用哪种方式进行UI布局更合适的讨论,请推荐他们先试用下 Masonry. Masonry,像xib一样快速,同时拥有作为纯代码方式的灵活性 – github关注度 7800+ 阅读详情

Masonry

  • Masonry是公认非常简洁优美的一款Autolayout框架
  • 我推荐大家重点学习这个框架
  • 我会把Autolayout的思维融合这个框架一起讲解

    Masonry的使用

  • 想要使用第三方Masonry要么要去GitHub上下载原代码下来拖进项目中,要么就直接使用cocoapods,pod search Masonry,下载最新版
  • cocoapods的使用不是本文讨论的范围,大家可以百度一下哈,安装非常简单

    Masonry的讲解

  • 因为之前的一篇关于VFL的文章我自我感觉写的不是太好,其实主要原因是VFL的约束创建非常宏观,如果既要照顾语法讲解,又要照顾约束理解,反而介绍会使文章增加很多口水话,长而乏味
  • Masonry的约束添加思维其实与苹果原API的添加思维是相同的,只是Masonry语法更简洁,代码更优美
  • 在这里,为了融合Autolayout的思想,我依然要说下面几点
    • Autolayout所倡导的两个核心词是约束,参照
    • 而我认为,Autolayout其实核心思想还是为了设置frame
    • 无论我们如何添加约束,最终还是为了确定其位置与尺寸
    • 所以,Autolayout的关键就是如何设置约束,让空间满足位置,尺寸这两个必要条件
    • 还有就是,当一个控件的约束已经能够满足上述两个条件了,就不要再添加多余的约束了,很容易会照成约束冲突
    • 除非你想设置其他优先级的约束
    • 优先级会在例子中说明其用处

      例子讲解

  • 由于Masonry是重点推荐的,我会分别用三个例子来讲诉它
    第一个例子
  • 这个例子很简单,仅仅是为了向大家介绍Masonry的语法
  • 比起文字阐述需求,我不如直接上图让大家看得更直接明白
  • 实现后的效果是这样的


图1
  • ok,接下来看看怎么用代码去实现这个效果
  • 先添加四个View

      UIView *redView = [[UIView alloc]init];
      redView.backgroundColor = [UIColor redColor];
      [self.view addSubview:redView];
    
      UIView *blueView = [[UIView alloc]init];
      blueView.backgroundColor = [UIColor blueColor];
      [self.view addSubview:blueView];
    
      UIView *yellow = [[UIView alloc]init];
      yellow.backgroundColor = [UIColor yellowColor];
      [self.view addSubview:yellow];
    
      UIView *green = [[UIView alloc]init];
      green.backgroundColor = [UIColor greenColor];
      [self.view addSubview:green];
  • 创建添加红色View的约束
    • 先来看看语法
    • Masonry的语法可读性非常强
    • 所以我不会在这里死板的一个单词一个单词的介绍
    • 大家在写的时候完全就可以像写句子一样,并且Masonry添加约束都是mas_makeConstraints这个方法
    • 只需要在块中写上想好的约束
    • 比如下面的第一个约束
    • 翻译过来就是使左边等于self.view的左边,间距为0
    • 而在块中主语就是调用者,这里也就是redView
    • 所以使用Masonry,你就想着是用英语在造句就行了,哈哈
    • 还有一点,and与with其实就是get调用者本身,里面仅仅是return self
    [redView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.view.mas_left).offset(0);//使左边等于self.view的左边,间距为0
        make.top.equalTo(self.view.mas_top).offset(0);//使顶部与self.view的间距为0
        make.width.equalTo(self.view.mas_width).multipliedBy(0.5);//设置宽度为self.view的一半,multipliedBy是倍数的意思,也就是,使宽度等于self.view宽度的0.5倍
        make.height.equalTo(self.view.mas_height).multipliedBy(0.5);//设置高度为self.view高度的一半

    }];
  • 上面我已经添加了redView的约束,它已经拥有了宽和高,还有水平方向和垂直方向的位置,也就是frame中的x,y,width,height,都有了
  • 所以redView的约束就添加完成了,无需再添加过多的约束
  • 其他的view将要以它为锚点,来添加约束,确定自身的位置与尺寸
  • 接下来设置blueView的约束
  • 大家在看下面代码之前可以自己思考,按照图1中的blueView的效果,我们应当怎样添加约束呢?
  • 很明显,只需要与红色等宽高,并且与红色左间距为0,顶部对齐,就可以了
[blueView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.width.and.height.equalTo(redView);//使宽高等于redView
        make.top.equalTo(redView.mas_top);//与redView顶部对齐
        make.leading.equalTo(redView.mas_right);//与redView的间距为0
    }];
  • 剩下的两个View的约束我就不过多的阐述了,大家可以自己先想一下怎么添加约束,再来看我代码是怎么实现的
  • 当然,很可能你的想法和我的实现不一样,这是很正常的,约束的实现方法有太多了
  • 但是万变不离其宗!一定得保证最终设置完毕后,所有的控件都拥有了位置与尺寸
[yellow mas_makeConstraints:^(MASConstraintMaker *make) {
        make.leading.equalTo(redView);//与redView左对齐
        make.top.equalTo(redView.mas_bottom);//与redView底部间距为0
        make.width.and.height.equalTo(redView);//与redView宽高相等
    }];
    [green mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(yellow.mas_right);//与yellow右边间距为0
        make.top.equalTo(blueView.mas_bottom);//与blueView底部间距为0
        make.width.and.height.equalTo(redView);//与redView等宽高
    }];
第二个例子
  • 这个例子我希望大家能对约束的理念有个更深的理解
  • 因为我一路写下来,一直用的都是固定尺寸的例子,或者是固定位置的例子,我怕误导大家认为Autolayout是非常死板的,必须把每个控件的约束添加到满足位置与尺寸,再去添加其他控件的约束,这样才不会出错
  • 其实不是这样的,的确,在所有控件添加完约束后,得拥有自己的位置与尺寸,但是有时这两个必须条件可以利用相对来满足
  • 接下来我就用例子来解释吧
  • 先让大家看一下效果图


竖屏


横屏
  • 正如大家在图片所看到的,我希望两个等宽高的红色方块能够在屏幕旋转的时候,间距等比例缩放,它们的相对位置是固定的,绝对位置随着屏幕的宽改变而改变
  • 其他三个灰色的方块,它们的宽是不确定,这就是我想要和大家说的相对概念
  • 我并没有固定死灰色方块的宽度,只要求它们与红色方块的间距为0,并且灰色方块的宽度相等
  • 但是红色方块的宽度是固定的,灰色方块就会互相相等的宽度,填充着红色方块间的空隙
  • 接下来看看代码是怎么实现的吧
  • 添加View的代码我就不上了,直接看添加约束的代码
//代码中View的顺序与图中从左到右的View的顺序一致
//例子中,唯一不确定的就是灰色View的宽度,我们先把确定的约束给一个一个的添加上来

//灰1左间距、高度、垂直位置(因为和红1底部对齐)是确定的,添加约束
[gray1 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.height.mas_equalTo(20);
        make.leading.equalTo(self.view.mas_leading).offset(0);
        make.bottom.equalTo(red1.mas_bottom);
    }];

//红1,宽高、左间距、底间距是确定的,添加约束
    [red1 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.width.mas_equalTo(100);
        make.height.mas_equalTo(50);
        make.left.equalTo(gray1.mas_right);
        make.bottom.equalTo(self.view.mas_bottom).offset(-50);
    }];
//灰2,左间距、高度、垂直位置是确定的,宽度要与灰1一致,是为了能均匀填充,添加约束
    [gray2 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.height.and.width.equalTo(gray1);
        make.leading.equalTo(red1.mas_right);
        make.bottom.equalTo(red1.mas_bottom);
    }];
//红2,宽高、左间距、底间距是确定的,添加约束
    [red2 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.height.and.width.equalTo(red1);
        make.leading.equalTo(gray2.mas_right);
        make.bottom.equalTo(red1.mas_bottom);
    }];
//灰3,左间距、右间距、高度、垂直位置是确定的,添加约束
    [gray3 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.height.and.width.equalTo(gray1);
        make.leading.equalTo(red2.mas_right);
        make.trailing.equalTo(self.view.mas_right);
        make.bottom.equalTo(red1.mas_bottom);
    }];
  • 大家看了上面的讲解后,会发现三个灰色方块都没有设置固定的宽
  • 但是它们三个都等宽,红色方块又是固定的,那么在这5个View间距都为0的情况下,灰色方块不就会去挤压红色方块,直到灰色方块宽度相等,那么红色方块也处在了应有的位置么
  • 这就是我想说的相对,红色方块宽度是固定的,那么水平方向上的间距就需要剩下的三个灰色方块去填充,当界面横屏时,三个灰色方块为了相对自身宽度要相同,相对红色边界,self.view边界,间距保持为0,那么就得牺牲自身宽度的稳定,去维持这些相对的约束
  • 希望我这些话能帮助大家更深刻的理解约束,更多的东西需要大家去做项目慢慢体会
第三个例子
  • 最后这个例子是老例子了,我想给大家看看其实Masonry做动画也和其他的Autolayout方法一样,但是添加约束的代码却非常的少,可以和我之前的另一篇文章比较一下
  • 里面的约束我就不讲解了,看了上面的代码,下面的约束对你来说肯定是小菜一碟
  • 约束代码
 UIView *redView = [[UIView alloc]init];
    redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView];
    UIView *greenView = [[UIView alloc]init];
    greenView.backgroundColor = [UIColor greenColor];
    [self.view addSubview:greenView];
    UIView *blueView = [[UIView alloc]init];
    blueView.backgroundColor  = [UIColor blueColor];
    [self.view addSubview:blueView];

    [redView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.view.mas_left).offset(20);
        make.bottom.equalTo(self.view.mas_bottom).offset(-20);
        make.width.equalTo(self.view.mas_width).multipliedBy(0.2);
        make.height.equalTo(self.view.mas_height).multipliedBy(0.2);
    }];
    [greenView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(redView.mas_right).offset(20);
        make.bottom.equalTo(self.view.mas_bottom).offset(-20);
        make.width.equalTo(self.view.mas_width).multipliedBy(0.2);
        make.height.equalTo(self.view.mas_height).multipliedBy(0.2);
    }];
    [blueView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(greenView.mas_right).offset(20);
        make.bottom.equalTo(self.view.mas_bottom).offset(-20);
        make.width.equalTo(self.view.mas_width).multipliedBy(0.2);
        make.height.equalTo(self.view.mas_height).multipliedBy(0.2);
        make.left.equalTo(redView.mas_right).offset(20).priority(250);
    }];
  • 动画代码
[self.greenView removeFromSuperview];
    [UIView animateWithDuration:1.0f animations:^{
        [self.view layoutIfNeeded];
    }];


动画前


动画后
  • 好了,Masonry就为大家讲解到这里,如果对Masonry的使用语法或者是对约束的思想还有什么不理解,希望您可以不吝惜的提出来,我希望能把文章做得更通俗易懂,更深刻!
嘉立创EDA实战:从点亮第一盏灯到完成首块PCB 本文详细介绍了使用嘉立创EDA从点亮第一盏LED灯到完成首块PCB的全过程。通过实战案例分享,包括原理图绘制、PCB设计、DRC检查、覆铜操作等关键步骤,帮助电子设计爱好者快速掌握嘉立创EDA的使用技巧,并避免常见的设计错误。 阅读详情

相关推荐

自相关互相关卷积的_相关性(Correlation)和相干性(Coherence)

1. 概念相关性(Correlation,或称相关系数或关联系数),显示两相关变量之间线性关系的强度和方向。在统计学中,相关的意义是用来衡量两个变量相对于其相互独立的距离。相干性(Coherence),与相关性计算得到的信息非常相似,都是衡量两个变量之间的相关程度,只是相干性多用于频域计算,可以在基于频率上给出更多的信息,而相关性多用于普通的数组计算和时域信号。这里其实应该有三个概念,c...

weixin_39963053的博客 3332

iOS Autolayout之Masonry解读

原文地址:http://www.jianshu.com/p/10a250cc5018 Masonry Masonry是公认非常简洁优美的一款Autolayout框架我推荐大家重点学习这个框架我会把Autolayout的思维融合这个框架一起讲解 Masonry的使用 想要使用第三方Masonry要么要去GitHub上下载原代码下来拖进项目中,要么就直接使用cocoapods,po

齐恒毅-博客专栏 663

别再调参了!用Simulink手把手教你搞定FOC电机速度环PI控制器(附模型下载)

本文详细介绍了如何使用Simulink搭建FOC电机速度环PI控制器,通过模最优准则和系统化调试方法,避免传统手动调参的繁琐过程。文章包含从传递函数推导到参数自动整定的完整流程,并提供了实战调试技巧与异常处理指南,帮助工程师快速实现电机控制系统的稳定运行。

weixin_42519985的博客 415

有趣的Autolayout示例-Masonry实现

文章转自:http://tutuge.me/2015/05/23/autolayout-example-with-masonry/?comefrom=http://blogread.cn/news/ 有趣的Autolayout示例-Masonry实现 前言 好久没有写Blog了,这段时间有点忙啊=。= 本文举了3个比较有“特点”的Autolayout例子,源于微博上好友的提

chaoyuan899的专栏 1万+

相控阵雷达“相控”原理---多张动画示意图完美解释

很容易就能发现,相控阵雷达的天线由无数个小单元天线组成,这些小单元天线叫做“阵元”,对于有源相控阵雷达来说,每一个阵元都是独立控制的,它们既能独立发射雷达波,也能接收雷达波的回波信号。相控阵雷达可以在1秒内关机,1秒内开机,好处是,当军舰遇到依靠雷达信号进行引导的“反雷达导弹”时,可以迅速地把朝向来袭导弹方向的雷达关机,同时,其他方向的雷达保持开启。在过去,军舰上安装有不同种类的雷达,体积庞大、重不说,另一个麻烦是干扰,常常是,一种雷达工作时,另一种雷达就会受到干扰,严重的甚至不能同时工作。

muyangjun的专栏 1万+

STM32 野火MINI 用FontCvtST.exe 生成.c文件 写汉字到文本框 按钮上

STM32 野火MINI 用FontCvtST.exe 生成.c文件 写汉字到文本框 按钮上 参考了好多大神博客,自己写的过程中发现,还有些小细节。 一、打开Notepad写需要的字 另存为 UTF-16LE 也就是Unicode。 二、打开FontCvtST转 删掉所有字 读入test.txt里的字 选择刚才的test.txt 另存为.c文件 改个英文名 复制到RTOS的例程文件夹下 三、打开GUIBuilder 画一个这样的 保存之前要注意路径配置要在当前位置,否则存不上 生成的D

weixin_41376117的博客 1936

Masonary-简化自动布局

Masonary的价值在iOS中,AutoLayout是一种灵活且高效的布局视图的方法,它通过约束简单明确的实现了多屏适配的功能,但是如果不用storyboard而使用,纯代码开发时,使用NSContraints就显得有些繁琐了,而Masonary就是创建自动布局的轻量级框架。如何安装 新建一个xcode工程 在Podfile中 添加 pod ‘Masonry’ (提示:最好在vim下编辑,关闭中文

ioSugar 1645

Shopee商品详情页反爬实战:手把手逆向x-sap-Ri和x-sap-Sec参数(附完整调试过程)

本文详细解析了Shopee商品详情页反爬机制中的x-sap-Ri和x-sap-Sec参数逆向过程。通过JS逆向技术,从环境数据采集到多层哈希运算,完整拆解了这两个关键参数的生成逻辑,并提供了实战技巧和Node.js实现方案,帮助开发者应对Shopee的动态加密挑战。

weixin_33701251的博客 1597

iOS自适应布局之Masonry(一)

前言 iPhone 5之前我们对应用布局停留在3.5寸一个屏幕的阶段,当时的安卓屌丝们是多么的羡慕iOS开发,不会被大量的屏幕适配所烦恼。随着iPhone产品的迭代,逐渐出现4寸、4.7寸、5.5寸….,你们说,iphone10+会有多少寸?O(∩_∩)O~ 简介 正因为上面说的那样,屏幕的尺寸逐步增多,还沿用以前的方法布局显然是...

weixin_33896069的博客 225

windchill安装搭建(保姆式)

保姆式搭建windchill 材料准备 Vmware工具,用来创建和打开虚拟机的工具 安装系统的镜像文件 数据库安装文件,这里是Oracle数据库 Windchill的安装包 Vmware工具,用来安装和打开虚拟机的软件 Windowsserver2008的镜像工具,用来安装虚拟机环境的系统,如果你有win2007或win2010的也可以,在做虚拟机时,需要先安装系统。 Oracle数据库安装包 Windchill11M030的安装包 (安装包如有需要可以私信邮箱发送) 虚拟机安装 安装虚拟机VMware

tr1294937662的博客 6218

cesium 淹没分析

cesium淹没分析

God's asylum的博客 481

iOS UITableview 刷新指定的某一个section或cell

好久没写了,来点儿基础的,开发中避免不了数据刷新,一般用[self.tableView reloadData];就可以搞定 但有时只需要刷新指定的某一组或某一行 //某个section刷新     NSIndexSet *indexSet = [[NSIndexSet alloc] initWithIndex:2];    [tableview reloadSections:index

sophia_xiaoma的专栏 9074

【深度学习新浪潮】2025年末AI产业动态:泡沫争议、技术突破与2026投资机会解析

2025年末的AI产业在波动中完成了阶段性调整,技术突破与政策支持构筑了长期成长基石,而结构性分化与风险隐患则要求投资者更加精准地把握机会。2026年作为“风险资产的黄金年”,AI全产业链将持续成为资本聚焦的核心,无论是算力国产化的技术突破,还是应用场景的规模化落地,都有望催生一批优质企业。投资者需立足产业阶段特征,理性看待短期波动,聚焦核心技术与政策红利,方能在AI产业的成长浪潮中把握确定性机会。

专注:太空算力、AI infra、异构调度、大模型成本工程 1810

iOS-使用Masonry布局不能立即获取到frame

前言 我相信很多同学曾经都遇到过这样的问题:明明用masonry布好局了,怎么获取到的frame就是0呢? 解决问题不难,百度一下就能找到答案,但如果只是单纯的解决问题而不去想为什么或许会制约我们的成长。 问题重现 1. 先看下面这段代码: [self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) { m...

MinggeQingchun的博客 2756

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

iOS Masonry布局获取Frame

方法1 [self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(UIEdgeInsetsMake(0, 0, 0, 0)); }]; // 先调用superView的layoutIfNeeded方法再获取frame [self.view layoutIfNeede

烽火连城的博客 7181

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

iOS开发 ☞ Masonary适配详解

习惯使用AutoLayout进行适配的人可能上手Masonary会非常迅速,下面简要的讲述一下Masonary适配的思路 github地址:https://github.com/SnapKit/Masonry 下面的代码是一个自定义View,并且对自定义View中的自控件进行布局。- (void)layoutSubviews { [self addSubview:self.headerVi

Magic-ZYJ的博客 2648

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Masonry 布局 scrollView

原理 scrollView的高度(纵向滑动时)时靠内部的子控件撑起来的。我们直接给ScrollView布局会发现失败。用层级检查器发现,ScrollVIiw的高度有问题,我们可以选择添加一个UIView容器,约束容器的edge.equalTo(self.scrollView),和 containerView.height.mas_equalTo(self.scrollView); 往这个...

weixin_30244681的博客 287

AutoLayout +Masonary

1, Masonry介绍与使用实践(快速上手Autolayout) http://adad184.com/2014/09/28/use-masonry-to-quick-solve-autolayout/ Xcode6中自动布局autolayout和sizeclass的使用 http://www.cocoachina.com/ios/20140915/9623.html 2,...

dazhi121812的博客 125

ios 使用Masonary创建等间距排列的控件

UIView *backView = [[UIView alloc] init]; backView.backgroundColor = [UIColor grayColor]; [self.view addSubview:backView]; [backView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.equalTo(self.view); make.top.

fsdf1151的博客 486

Masonary

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34235135的博客 232

Masonry对TableViewCell进行自动布局

说明:因为项目需要想先做一个cell展开折叠的Demo,看了网上很多cell展开折叠的方式都是用另外一个cell来替换,感觉完全没必要,忽然想到了Masonry(这确实是个好东西啊),所以花了点时间利用Masonry来改造了一下。 简介:点击一行后cell会展开,再次点击cell会折叠,采用Masonry自动布局,效果如下: Demo地...

weixin_33857230的博客 247

关于用 Masonary实现三个View等间距的实现

之前有用过autoLayout代码和脱线实现如下效果 然后横向实现 现在我通过Masonary来再次实现如上效果 代码如下 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a

u012655309的专栏 703

Masonary简单使用

Masonary注意:(若想适配ipad 在general 中 选择 devices -> Universal)引入Masonry 在github 上搜索 就可以了引入头文件 @“Masonry”在viewDidLoad 中写入 UIView *myView = [[UIView alloc] init]; myView.backgroundColor = [UIColor blueC

lzq1993dn的博客 1282

Masonary的简单使用

Masonary是一个给控件添加约束条件的第三方库,它是轻量级的布局框架。它和autolayout作用差不多。 支持一下属性 @property (nonatomic, strong, readonly) MASConstraint *left; @property (nonatomic, strong, readonly) MASConstraint *top; @property ...

weixin_30443075的博客 256
上一篇: iOS-文件路径 temp document library 等
下一篇: swift-代理方法
董其林
博客等级 码龄11年 1粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值