
刚开始做iOS开发那会儿,布局这块简直就是我的噩梦。那时候大家都在用Autolayout,整天跟Constraint打交道,各种冲突、各种莫名其妙的约束失效,搞得我焦头...
刚开始做iOS开发那会儿,布局这块简直就是我的噩梦。那时候大家都在用Autolayout,整天跟Constraint打交道,各种冲突、各种莫名其妙的约束失效,搞得我焦头烂额。
后来听说有个叫Masonry的东西,能用代码写布局,看着那些示例好像挺简洁的,就想着试试看。毕竟对着一堆约束条件在那儿敲来敲去的,还不如直接写代码来得痛快。
我记得我第一次动手用Masonry,就是想把两个View叠一块儿,一个靠左,一个靠右,然后中间留点缝隙。那时候网上的教程还不是很多,我对着官方文档摸索了半天。
我把Masonry加到项目里,引入头文件,然后就开始写我的第一个布局代码。想象一下,一个View,我直接对它说:“你给我靠着父视图的左边,离10个点,高度给我固定成100,宽度给我固定成200。”

这感觉比AutoLayout直观多了。就是下面这几行核心代码,我到现在都记得清清楚楚:
leftView和rightView。leftView布局:[leftView mas_makeConstraints:^(MASConstraintMaker make) { *(*).*(10); *(*).*(20); *_equalTo(CGSizeMake(100, 100)); }];rightView布局:[rightView mas_makeConstraints:^(MASConstraintMaker make) { *(*).*(-10); *(*_bottom).*(10); *(leftView); *(@100); }];你瞧,是不是特简单?直接点明了我要它们在哪里,要多大。特别是*(*_bottom).*(10);这一句,直接就说明了rightView的顶部要比leftView的底部低10个点,逻辑清晰得一批。
后来项目复杂起来,我开始做列表布局,那一堆Cell里面的子控件布局,用Masonry简直解放了我的双手。比如一个标题标签,我要它靠左上角,然后下面的内容标签要跟着它,但是要留出图片的位置。
我还是那一套流程:拿到父视图,然后对着里面的每个子控件开始“下命令”。

标题titleLabel:*.equalTo(superView).offset(15);
内容contentLabel:*(titleLabel); *(*_bottom).offset(5); *(superView).offset(-150);
这里我就用到了“小于等于”lessThanOrEqualTo,这在处理动态内容的时候太有用了,保证了布局不会撑破边界。
再比如我要实现一个水平居中的效果,或者让几个按钮等间距排列,Masonry里面都有对应的方便函数。我甚至可以不用写死宽度,直接让它们平均分配剩余空间:*.spaceToSuperView(UIEdgeInsetsZero); 这种写法比AutoLayout里搞一堆比例约束简单多了。
这几行代码一写完,再跑起来,布局就立马到位了。虽然还是得稍微调整一下偏移量(offset),但比起我之前跟AutoLayout死磕的日子,简直是天壤之别。我感觉我从一个布局的“受害者”变成了一个布局的“指挥官”,敲代码写布局,那感觉就是爽。