相对于复杂的frame位置的计算,Mansory简洁高效的语法和使用更受到开发者的喜爱。对一个视图的约束不光是要有能够约束控件的能力,更要有设计约束的思想。
最近的一次需求变动,要调整之前的一个板块,加入类似微博的@功能和当仅有一张图片时使图片的比例和原始比例对应,不做裁剪。
类似于下图:
开始做的时候我觉得很容易,具有@功能的需求我选择了用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产生压力。同样,约束不是通用万能的,在其它环境下可能还有其它需要注意的地方,所以会约束只是皮毛,如何设计好一个约束才是能力。
网友评论