相對于復(fù)雜的frame位置的計算,Mansory簡潔高效的語法和使用更受到開發(fā)者的喜愛沦童。對一個視圖的約束不光是要有能夠約束控件的能力庆尘,更要有設(shè)計約束的思想鳄梅。
最近的一次需求變動,要調(diào)整之前的一個板塊衩匣,加入類似微博的@功能和當(dāng)僅有一張圖片時使圖片的比例和原始比例對應(yīng)蕾总,不做裁剪粥航。
類似于下圖:
開始做的時候我覺得很容易,具有@功能的需求我選擇了用YYLabel實現(xiàn)(生百。递雀。。自己能力有限蚀浆,玩不轉(zhuǎn)coreText)缀程,通過正則篩選出需要高亮的文字部分,圖片的處理通過服務(wù)器返回的原圖尺寸自己處理一下市俊。
cell的高度通過model的計算文字之類的相加起來杨凑,然后對應(yīng)的cell內(nèi)部的控件里面更新一下約束,關(guān)鍵的幾個約束我是這樣設(shè)計的:
1.YYLabel因為繼承與UIVIew摆昧,它的約束就不能單純地像UILabel那樣讓它自適應(yīng)文字高度撩满,它需要想Lab一樣有完整的約束,對此绅你,我約束了YYLabel的上左下右伺帘。
2.中間的ImageView我約束了居下和居左,動態(tài)更新size忌锯。
看起來好像很正確沒有什么問題伪嫁,確實,這要是放在普通的view上不會出現(xiàn)問題汉规,但是放在cell上就有很大的問題了礼殊,cell的復(fù)用機(jī)制使得控件間會產(chǎn)生約束沖突。之前完全沒有留意到這個地方针史,導(dǎo)致我跳坑跳了半天晶伦。
約束沖突出現(xiàn)的場景:
一旦cell的圖很大,在它下一次復(fù)用的時候先會計算cell的高度啄枕,這時候這個高度可能會擠壓著內(nèi)部的控件(因為內(nèi)部控件的約束設(shè)計的時候?qū)ell的ContentView產(chǎn)生的壓力)婚陪,Cell高度變了但控件的約束還是之前的,這個時候就會報約束沖突频祝。但在為cell賦值的時候泌参,更新后的約束又使得約束正常了。所以出現(xiàn)了視圖正常缺不斷報約束沖突的現(xiàn)象常空。
既然知道了原因沽一,那么解決的方式也很簡單,就是不要讓內(nèi)部的控件對cell的ContentView產(chǎn)生壓力漓糙。我調(diào)整了YYLabel的約束铣缠,讓它居下約束變?yōu)閯討B(tài)更新高度,這個問題就解決了。
所以蝗蛙,個人覺得在cell上使用mansory做約束的時候蝇庭,設(shè)計的約束必須要考慮到內(nèi)部控件不對cell的ContentView產(chǎn)生壓力。同樣捡硅,約束不是通用萬能的哮内,在其它環(huán)境下可能還有其它需要注意的地方,所以會約束只是皮毛壮韭,如何設(shè)計好一個約束才是能力北发。