前言


讲真的,搞事搞了四五年的时间了,一直觉得AutoLayout布局方式比较影响性能,所以一直使用着最原始的Frame布局方式,但是随着机器性能的不断提高,我觉得AutoLayout这种布局方式已经可以基本忽略对性能方面的影响,而且在复杂布局方面AutoLayout有着Frame布局没有的优势,简单粗暴。这两天,我也是刚刚开始使用 Masonry ,说真的,真香。

这里需要简述一下Frame布局方式和Masonry布局方式各有什么优缺点。我觉得这种谁强谁弱的问题要去辩证的看待,Frame布局方式在简单UI排版情况下,较为简单,而且性能极高,但是不利于扩展,例如如果是横竖屏情况就基本上需要使用两套布局方案,非常的麻烦和繁琐。反观Masonry布局,使用起来较为方便,可以轻松应对各种布局方式,但是在性能上存在问题,使用不当容易造成性能问题,性能方便要比Frame布局方式差很多。整体来说,简单布局使用Frame布局,复杂布局使用Masonry布局,至于界限需要自己把握(这就跟解耦和耦合的问题一样,界限完全是自己来掌控的,自己把握好度即可)。

约束的常识


在写Masonry之前,我想先来聊聊约束的基础知识,我们首先要了解一个View的约束需要确定的是两个因素,一个是宽高信息,另外一个是位置信息。 只有确定这两个因素才能真正的确定一个View的约束,否则约束会爆警告。不管你怎么加约束,其实最后归根到底都是确实的这两个信息,那么我们了解这个有什么好处呢?我们可以通过约束转化来了解我们多添加了约束,是否缺失了某个约束,这种思想可以帮助我们快速查询问题所在。

但是有很多童鞋会发现在使用 Masonry 的时候,如果控件是UILabel,UIImageView,UIButton等这些组件及某些包含它们的系统组件只需要指定控件的位置约束,根本不需要指定宽高约束即可完成布局任务,这是为什么呢?这是因为这些控件中有 intrinsicContentSize 这个属性,intrinsicContentSize的作用其实很简单,它会自己根据内容计算出控件的固有宽高,在布局过程当你不指定宽高约束的时候,它就会生效。具体的内容我会在下面说到。这里就不过多叙述了。

Masonry的使用


Masonry的使用百度上随意一搜索就是一大堆,这里也简单的介绍一下吧。

首先,Masonry的添加布局主要有三个,三个方法的作用分别是创建约束;更新某个约束,其他约束不变;移除先前所有约束,添加新到的约束。这三个方法根据场景需要合理使用,否则可能造成内存问题,优化方式下面我们会来聊一下,这里就不过多叙述了。

- (NSArray *)mas_makeConstraints:(void(NS_NOESCAPE ^)(MASConstraintMaker *make))block;- (NSArray *)mas_updateConstraints:(void(NS_NOESCAPE ^)(MASConstraintMaker *make))block;- (NSArray *)mas_remakeConstraints:(void(NS_NOESCAPE ^)(MASConstraintMaker *make))block;

假设我们有一个subView视图(添加约束之前要先添加到父视图上,这里就不多比比了),我们该怎么给这个subView视图添加约束呢?

[subView mas_makeConstraints:^(MASConstraintMaker *make) {make.left.equalTo(self.view).offset(10);make.top.equalTo(self.view).offset(10);make.right.equalTo(self.view).offset(-10);make.bottom.equalTo(self.view).offset(-10);
}];

上面的写法我们可以把 self.view → self ,Masonry内部会自动处理的,形式如下所示。

[subView mas_makeConstraints:^(MASConstraintMaker *make) {make.left.equalTo(self).offset(10);make.top.equalTo(self).offset(10);make.right.equalTo(self).offset(-10);make.bottom.equalTo(self).offset(-10);
}];

当然了,每一个控件都写这么四个约束(上,下,左,右),肯定是能把人累的半死,我们可以设置 edges 来简化我们的代码,上面的代码就转化成如下代码形式。而且我们发现下面的代码,-10已经变成了10,这是因为 insets 已经帮我们自动处理过了,这点我们需要注意了。

[subView mas_makeConstraints:^(MASConstraintMaker *make) {make.edges.equalTo(self).with.insets(UIEdgeInsetsMake(10, 10, 10, 10));
}];

如果我们想设置一个具体的数值该怎么办呢?例如宽度我们想设置成10个单位,我们就可以如下设置。

[subView mas_makeConstraints:^(MASConstraintMaker *make) {make.width.equalTo(@10);
}];

我们发现上面代码还有个问题,那就是 equalTo 这个函数的参数必须是一个对象类型,这就很尴尬了,为啥,书写太麻烦,这时候我们可以使用 mas_equalTo 这个函数,示例如下所示。

[subView mas_makeConstraints:^(MASConstraintMaker *make) {make.width.mas_equalTo(10);
}];

上面书写的好像也不是一个最优的方案,虽然我们解决了后面的问题,但是前面的代码字母数又多了(懒癌发作

浅谈Masonry的使用技巧相关推荐

  1. 小学计算机打字基础知识,浅谈小学计算机教学技巧5篇

    <浅谈小学计算机教学技巧5篇>由会员分享,可在线阅读,更多相关<浅谈小学计算机教学技巧5篇(3页珍藏版)>请在装配图网上搜索. 1.浅谈小学计算机教学技巧5篇浅谈小学计算机教学 ...

  2. 浅谈数据库设计技巧(上)

    浅谈数据库设计技巧(上) 说到数据库,我认为不能不先谈数据结构.1996年,在我初入大学学习计算机编程时,当时的老师就告诉我们说:计算机程序=数据结构+算法.尽管现在的程序开发已由面向过程为主逐步过渡 ...

  3. Linux命令删除find,浅谈Linux下通过find命令进行rm文件删除的小技巧

    我们经常会通过find命令进行批量操作,如:批量删除旧文件.批量修改.基于时间的文件统计.基于文件大小的文件统计等,在这些操作当中,由于rm删除操作会导致目录结构变化,如果要通过find结合rm的操作 ...

  4. led手电筒烧灯珠_浅谈务优LED手电筒灯珠型号与区别技巧

    原标题:浅谈务优LED手电筒灯珠型号与区别技巧 LED灯珠有多种型号规格: LED灯珠的型号太多了,有直插和贴片式的,还有大功率灯珠,灯珠电流从几十毫安到几安的都有,电压就比较一致,大多都在三点几伏. ...

  5. 浅谈微博SEO搜索优化小技巧

    [微博营销] 时下最热门的互动平台莫过于微博了,微博的火爆,为每天生活在互联网中的人提供了一个全新的社交模式.微博也正由于其良好的互动性及操作的简单性吸引了大量的用户聚集.面对如此庞大的市场,新浪.网 ...

  6. 与你浅谈百度知道问答推广工作的注意事项及技巧

    与你浅谈百度知道问答推广工作的注意事项及技巧 欢迎阅读全网天下大G分享 在中国网民的日常生活中扮演了及其重要的作用,更是遇事不决问百度的说法广为流传.百度作为一个信息展示平台,也是众多商家宣传推广自身 ...

  7. 浅谈我在职场中与人相处的技巧

    [首页推荐]浅谈我在职场中与人相处的技巧 作者:瘦狐狸 日期:2007-1-3 2:54:00     很多人一谈到人际关系,都说不会处理.我其实也很不会处理复杂的人际关系,年轻的时候,心高气盛的和领 ...

  8. 浅谈VB6.0中的实用技巧

    浅谈VB6.0中的实用技巧 (一) VB6.0中文本框处理技巧 在Visual Basic中,文本框(TextBox)是最常用的控件,熟练运用文本框 是开发出高质量的应用程序的基础.笔者在从事应用程序 ...

  9. eltable 无数据文案修改_软文文案修改技巧:浅谈文章写作修改的几个方法

    下面,就文章修改时应注意的方面浅谈自己的见解: 第一:着眼全篇,从整体到局部进行修改 一提到文章修改,有的同学可能就认为这简单,不就是看文中有没有错别字,病句嘛.于是一动笔就埋头于词句的修改中,对文章 ...

最新文章

  1. wxWidgets:异形窗示例
  2. adaboost mh matlab,Adaboost算法的前世今生
  3. RabbitMQ简单介绍+Windows环境安装
  4. px、dp和sp,这些单位有什么区别?
  5. One-Error多标签分类_深度学习:如何在多标签分类问题中考虑标签间的相关性?
  6. mysql追溯历史性能问题_【踩坑記錄】記一次MySQL主從復制延遲的坑
  7. java百度结果的正则表达式_java正则表达式
  8. 高效访问Internet-启用ISA Server的缓存
  9. 【转载】Python tips: 什么是*args和**kwargs?
  10. Redis未授权访问缺陷让服务器沦为肉鸡
  11. (转)sqlite developer注册方法
  12. 功能强大的黑科技APP,各种免费资源一应俱全!
  13. 触摸屏单个按键远程控制led
  14. 树莓派实验室python人脸识别_使用树莓派进行简易人脸识别
  15. Composer开启多线程组件改变composer缓慢问题
  16. 童鞋想盗取我十几个G的“种子”,看我是用python来层层加锁!!!
  17. Flink 最锋利的武器:Flink SQL 入门和实战带你了解NBA球星数据
  18. 【面经】上汽 智能驾驶中心
  19. 锚杆拉拔试验弹性模量计算_锚索刚度怎样计算
  20. 【学习笔记】集合幂级数

热门文章

  1. 红与黑 vs 漂亮朋友 同一个梦想,不同的命运
  2. 笔记本连不上网怎么办
  3. C语言初学零基础(一)——安装Visual Studio2022
  4. m3u8 php vob 服务器,使用ffmpeg下载m3u8
  5. 郝健: Linux内存管理学习笔记-第1节课
  6. orb-slam系列 LocalMapping线程 开始(八)
  7. Fiddler使用介绍
  8. 30位90后霸榜! 福布斯: 比你年轻、比你有颜、比你有才华, 就是他们了!
  9. CIF、DCIF、D1区别_昂首阔步_百度空间
  10. 赵小楼《天道》《遥远的救世主》深度解析(119)你想怎么活?没有对错,只有适合