美文网首页iOS移动开发进阶
在cell上使用Mansory做约束的“坑”

在cell上使用Mansory做约束的“坑”

作者: 举个栗子wow | 来源:发表于2016-06-20 14:38 被阅读573次

    相对于复杂的frame位置的计算,Mansory简洁高效的语法和使用更受到开发者的喜爱。对一个视图的约束不光是要有能够约束控件的能力,更要有设计约束的思想。
    最近的一次需求变动,要调整之前的一个板块,加入类似微博的@功能和当仅有一张图片时使图片的比例和原始比例对应,不做裁剪。
    类似于下图:

    9C81CB0D-C6CB-47D7-8904-90F8F552035D.png 9F9AC005-5088-4FAD-BBC5-74CD0B3DE8C6.png

    开始做的时候我觉得很容易,具有@功能的需求我选择了用YYLabel实现(。。。自己能力有限,玩不转coreText),通过正则筛选出需要高亮的文字部分,图片的处理通过服务器返回的原图尺寸自己处理一下。
    cell的高度通过model的计算文字之类的相加起来,然后对应的cell内部的控件里面更新一下约束,关键的几个约束我是这样设计的:

    1.YYLabel因为继承与UIVIew,它的约束就不能单纯地像UILabel那样让它自适应文字高度,它需要想Lab一样有完整的约束,对此,我约束了YYLabel的上左下右。
    2.中间的ImageView我约束了居下和居左,动态更新size。

    看起来好像很正确没有什么问题,确实,这要是放在普通的view上不会出现问题,但是放在cell上就有很大的问题了,cell的复用机制使得控件间会产生约束冲突。之前完全没有留意到这个地方,导致我跳坑跳了半天。
    约束冲突出现的场景:

    一旦cell的图很大,在它下一次复用的时候先会计算cell的高度,这时候这个高度可能会挤压着内部的控件(因为内部控件的约束设计的时候对cell的ContentView产生的压力),Cell高度变了但控件的约束还是之前的,这个时候就会报约束冲突。但在为cell赋值的时候,更新后的约束又使得约束正常了。所以出现了视图正常缺不断报约束冲突的现象。

    既然知道了原因,那么解决的方式也很简单,就是不要让内部的控件对cell的ContentView产生压力。我调整了YYLabel的约束,让它居下约束变为动态更新高度,这个问题就解决了。
    所以,个人觉得在cell上使用mansory做约束的时候,设计的约束必须要考虑到内部控件不对cell的ContentView产生压力。同样,约束不是通用万能的,在其它环境下可能还有其它需要注意的地方,所以会约束只是皮毛,如何设计好一个约束才是能力。

    相关文章

      网友评论

        本文标题:在cell上使用Mansory做约束的“坑”

        本文链接:https://www.haomeiwen.com/subject/jnuwdttx.html