Masonry动态布局的解决方案

这篇文章不是用来介绍如何通过Masonry来实现auto layout的,并且是假设读者已经对使用 Masonry 有一定的经验了。

以下面这个页面为例,页面元素的基本布局是 **self.view ****UIScrollView ******UIView (containerView) ********UILabel, UITextField, UIButton, UITableView, CustomView

其中部分元素是动态的:基于Model中的数据不同,Related AC下面有时候会显示一排label的描述,如果没有对应数据就不显示。同样地,Expense List下面也有一个UITableView,如下图,区别主要在于页面元素之间的间隔会发生变化。另外,在这个页面编辑的过程中,如果用户点击对应属性后面的添加按钮,Related AC和Expense List下面对应的数据都会发生变化。

如何刷新才能让页面中的view基于数据重新排版?

为了说明问题,上面这个页面只是一个简单的示例,但是我们需要找到的是一种通用的解决方案

有两个方法:

每次需要刷新页面时,先把scrollView的content offset记下来,同时也把所有的和数据相关的view的值都保存到Controller中的新property中,然后删除所(!)有(!)self.view中的subviews,然后重新创建新的view对象,这个时候重新创建(mas_makeConstraint)所有view的约束,把之前保存的所有数据全部都赋值给新view。

这种方案不好的地方在于完全把ViewController中的重要view和对应view的数据显式分开了,需要额外注意每次在“刷新”UI的时候把所有的view及其数据做好对应保存。

如果某个view还存在跟随数据变化的同时和有其他属性变化,在“刷新”UI的时候还需要做一些额外的临时状态保存处理。

让页面上所有的元素在整个ViewController的生命周期中只创建一次,然后把所有需要在“刷新”时需要做位置变换的view(这至少包含了所有会发生数据变化的view)全部创建为controller类的property,数据发生变化后“刷新”UI时,只需要remake所有相关的view’s constraints。

相比之下这样做的好处是没有把view和它的数据及属性分开,在controller中更清晰一些。

我虽然已经用Masonry来完成auto layout很久了,但是updateConstraint和remakeConstraint还是用得不多的。这个方法中就大量用了remake来更新UI页面元素位置。

UIViewController中有两个需重载的重要方法,- (void)viewDidLayoutSubviews和- (void)updateViewConstraints,代码实现如下。


为了尽量把make和remake同样的constraint放到同一个实现中,所以我又额外写了一个针对Masonry的两个helper方法:


就这样,所有UIView的constraint都在- (void)updateMASLayout:方法中实现。这个实现目前我在iOS 9/Xcode 7中演示成功。

至于到底选择那种方案来实现类这种动态页面的布局,个人认为还是需要部分参考项目需求,如果有太多view属性也需要跟随着数据发生变化的话,建议还是参考第二种。

关于针对UIScrollView的contentSize在autolayout中的适配问题,下面是两个参考。

Masonry 开源项目有一个关于UIScrollVIew的示例,是基于纯代码布局的解决办法。

AutoLayout深入浅出三[相遇Scrollview] , 如果是storyboard/xib实现的布局,可以看看这篇文章提供的解决办法。

转载至http://www.07net01.com/2015/11/957821.html

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,897评论 25 707
  • 梁先生姓梁,因为不出名,所以名字就不用说了,在这里暂且就直接称作梁先生吧。 梁先生是我的男朋友,我们认识三年零两个...
    苟小慧阅读 563评论 0 0
  • 凡事不可期望值过高,否则失望也会愈大! 在《想好了?那祝你好运!》那篇文章里,我说小w在三个月试用期的表现不错,甚...
    摘月亮阅读 655评论 2 5
  • “热啊” 消息里朋友发来消息,还有几个大哭的表情。 最近她约了曾经一起在西安读书的同学去西安玩,相对于我们那个被称...
    遥之无忘阅读 341评论 0 3
  • 方正闻言顿时来了精神头说道 :“那你倒是快说说看怎么个硬拼法?” 郑广坤说道 :“昨天从冥界回来以后,我就去了师兄...
    长白居士阅读 397评论 0 0