前言:
當(dāng)cell內(nèi)容是不固定時(shí),我們可以通過(guò)autolayout 來(lái)完成自動(dòng)高度計(jì)算,而不必手動(dòng)計(jì)算。
但這里往往會(huì)遇到一個(gè)問(wèn)題:
? ? 第一次完成cell布局后,當(dāng)填充cell的數(shù)據(jù)發(fā)生變化,我們手動(dòng)更新約束時(shí),比如使用masonry的mas_makeConstraints更新時(shí),可能會(huì)在控制臺(tái)看到以下約束沖突警告
[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.
先說(shuō)解決方案:
? ? 如果要去掉以上警告,我們需要調(diào)低下cell中子控件約束的優(yōu)先級(jí),理論上是降低任一子控件的垂直方向上的約束都可以,但通常為了統(tǒng)一,往往是調(diào)整位于cell中最底下的那個(gè)子控件與cell的bottom間的約束優(yōu)先級(jí)參數(shù)。
再說(shuō)為什么需要這么做及為什么能這么做:
? ? 之所以出現(xiàn)沖突警告是因?yàn)閏ell在完成布局后,系統(tǒng)會(huì)自動(dòng)給cell的高度加上一條約束,并且優(yōu)先級(jí)是1000;而當(dāng)數(shù)據(jù)變化導(dǎo)致控件高度發(fā)生改變從而引起cell的底部約束-cell的頂部 ≠系統(tǒng)計(jì)算好的cell高度約束,系統(tǒng)就會(huì)報(bào)出約束沖突。
? ? 但是,雖然報(bào)了約束沖突警告,但我們看到的cell UI顯示卻符合預(yù)期,高度正常更新。這是因?yàn)樵趓unloop在下一輪UI重繪時(shí),Cell又會(huì)重新根據(jù)控件的約束計(jì)算cell高度,然后更新自身高度約束。
因此,解決方案就可以簡(jiǎn)單的調(diào)整優(yōu)先級(jí)來(lái)避免觸發(fā)沖突警告。