Masonry 开源库阅读心得

Masonry 是Facebook 开放的一个针对IOS 框架代码进行autolayout布局的开源库。

ios的自动布局(auotlayout)一般有两种方式:1.通过XIB或stroryBoard 实现,2.通过纯代码实现。

在实际项目中自动布局(autolayout)大部分情况是使用前者,但在前者不能实现或者很难实现情况下,采用了后者。如果使用ios系统自带的方式来实现autolayout,那将是一个很麻烦的事情。 而Masonry可以帮助我们轻松愉快地实现。

Masonry源码一般是从【UIView mas_makeConstraints:^(MASConstrraintMake *make) {

  make.size.mas_equalTo(CGSizeMake(100,100));

  make.top.mas_mas_equalTo(30);

}】开始的,mas_makeConstraints 内部就4行代码,

首先设置translatesAutoresizingMaskIntoConstraints 变量为NO,

第二行就创建一个MASConstraintMake对象,

第三行就调用block对象,其实就回到了make.size.mas_equalTo中,把用户自己加入的约束都添加上。

第四行执行【constrainMake install】,该函数内if (self.removeExisting) 的条件判断在调用mas_makeConstrains是不会执行的,该条件判断一般是调用mas_remakeConstrains接口才会执行。接着遍历约束数组,都执行[constraint install] 函数,该函数内重要的是如果已经存在该约束,就直接更新,否则就添加该约束到self.installedView数组中,

代码如下:

if (existingConstraint) {

        // just update the constant

        existingConstraint.constant = layoutConstraint.constant;

        self.layoutConstraint = existingConstraint;

    } else {

        [self.installedView addConstraint:layoutConstraint];

        self.layoutConstraint = layoutConstraint;

        [firstLayoutItem.mas_installedConstraints addObject:self];

    }

在遍历所有约束的时候,有个技术技巧:就是不直接操作self.constraints,而是重新拷贝一个新的约束数组(NSArray *constraints),这样保证了constraints数据的安全。

至于self.constraints数组是在何时装载数据的。答案就是在调用block的时候装载的,具体就是在mas_equalTo宏中。通过以上4行代码,就完成了约束的装载。

接下来看看mas_equalTo内部做的事情:

mas_equalTo 宏与equalTo函数的区别,前者支持CG等开头的对象,例如(CGSizeMake),后者只支持基本数据类型,例如int ,float之类的。 建议统一使用mas_equalTo宏。

mas_equalTo宏本质就是调用- (MASConstraint * (^)(id))equalTo函数,该函数就是调用self.equalToWithRelation函数,self.equalToWithRelation函数有两个参数,前一个参数attribute就是上层传入的参数,以上述例子为例就是mas_equalTo(CGSizeMake(100,100)) 或mas_equalTo(30);中的CGSizeMake(100,100) 或30,参数2设置为NSLayoutRelationEqual,结合mas_equalTo(30)例子就是等于30. 还可以设置大于30 或小于30.分别为NSLayoutRelationGreaterThanOrEqual和NSLayoutRelationLessThanOrEqual

self.equalToWithRelation函数内部就调用了- (MASConstraint * (^)(id, NSLayoutRelation))equalToWithRelation; 该函数主要是保存参数1和参数2, 不解的是就是仅仅做保存。没有操作。why??????

最后总结下:

1.Masonry开源库适合于纯代码方式的自动布局(autolayout),千万不要与Xib或stroyboard一起混用。原因是Masonry库只管理block内部添加的约束,对于Xib或stroyboard的系统约束没有管理。

2.关于自动布局的使用理解方式:若是屏幕居中,那就是left,top,right,bottom的offset各为一个数字,且size为(CGSizeMake(width,height)) ,当然也可以使用center设置;若是两个视图等宽,首先设置视图1的top,left,bottom边距以及size大小,接着设置视图2的top,bottom和right(视图1不能设置right, 视图2不能设置left)。第三步才设置视图1的right是相对视图2的left的。同理与两视图的等高。就要设置视图1的bottom相对于视图2的top了。 对于三视图就需要考虑视图1的right,视图2的left和right,视图3的left 三情况。

3.链式编程,Masonry库就是使用链式编程的(将多个方法用点语法链接起来),简单的理解就是view.top.left.right.bottom.mas_equalTo()中的.top.left之类的。对于这些方法就不用一个一个赋值了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容

  • 一、前言 关于苹果的布局一直是我比较纠结的问题,是写代码来控制布局,还是使用storyboard来控制布局呢?以前...
    iplaycodex阅读 2,444评论 0 1
  • iOS_autoLayout_Masonry 概述 Masonry是一个轻量级的布局框架与更好的包装AutoLay...
    指尖的跳动阅读 1,157评论 1 4
  • Masonry是一个轻量级的布局框架,拥有自己的描述语法,采用更优雅的链式语法封装自动布局,简洁明了并具有高可读性...
    3dcc6cf93bb5阅读 1,762评论 0 1
  • (一)Masonry介绍 Masonry是一个轻量级的布局框架 拥有自己的描述语法 采用更优雅的链式语法封装自动布...
    木易林1阅读 2,328评论 0 3
  • 文/爱瑋儿 图/部分网络 黑暗的屏幕上跳出的第一行字幕,是作者庆生的同名短篇小说的第一句话: "七月第一次遇见安...
    爱瑋儿阅读 2,676评论 44 73