前言:
当cell内容是不固定时,我们可以通过autolayout 来完成自动高度计算,而不必手动计算。
但这里往往会遇到一个问题:
第一次完成cell布局后,当填充cell的数据发生变化,我们手动更新约束时,比如使用masonry的mas_makeConstraints更新时,可能会在控制台看到以下约束冲突警告
[LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
先说解决方案:
如果要去掉以上警告,我们需要调低下cell中子控件约束的优先级,理论上是降低任一子控件的垂直方向上的约束都可以,但通常为了统一,往往是调整位于cell中最底下的那个子控件与cell的bottom间的约束优先级参数。
再说为什么需要这么做及为什么能这么做:
之所以出现冲突警告是因为cell在完成布局后,系统会自动给cell的高度加上一条约束,并且优先级是1000;而当数据变化导致控件高度发生改变从而引起cell的底部约束-cell的顶部 ≠系统计算好的cell高度约束,系统就会报出约束冲突。
但是,虽然报了约束冲突警告,但我们看到的cell UI显示却符合预期,高度正常更新。这是因为在runloop在下一轮UI重绘时,Cell又会重新根据控件的约束计算cell高度,然后更新自身高度约束。
因此,解决方案就可以简单的调整优先级来避免触发冲突警告。
网友评论