想必Masonry是什么?就不用解釋了。公司項目采用純代碼布局流部,使用的就是Masonry雕憔,當然使用Masonry布局,時長會出現(xiàn)約束沖突的問題,這也就開始了我的再次優(yōu)化之路->消除約束沖突瑞你。
當然控制臺打印的約束沖突镀赌,一般顯示不會有問題音念,個別除外沪饺,約束本來就是錯誤的那就另當別論了!雖然不影響功能實現(xiàn)闷愤,此類警告信息看著很不爽整葡。
解決此類問題時,順便做下總結(jié)讥脐,產(chǎn)生約束沖突一般為以下幾種情況:
1.約束冗余
2.更新約束
3.約束優(yōu)先級
一遭居、約束冗余
設(shè)置約束冗余,顧名思義就是對于同一約束項旬渠,添加了過多的約束限制俱萍,從而產(chǎn)生沖突。例如:圖中設(shè)置的冗余約束為告丢,視圖的高度約束枪蘑,因為已經(jīng)添加了top、height岖免,此時約束已經(jīng)設(shè)置好了岳颇,bottom是已經(jīng)知曉的,但是又設(shè)置了一次bottom颅湘,所以造成了約束冗余话侧,刪除bottom約束即可。其他冗余約束類似栅炒。
二掂摔、更新約束
一般設(shè)置約束之后术羔,在某些特定的場景下赢赊,需要更新約束設(shè)置,此時比較容易造成約束沖突级历。翻閱Masonry GitHub Readme可知释移,其設(shè)置約束常用的方法:
1、mas_makeConstraints
正常設(shè)置約束方法寥殖。
2玩讳、mas_updateConstraints
更新約束方法。(注意:更新常量值)
3嚼贡、mas_remakeConstraints
重新設(shè)置約束方法熏纯。(刪除之前的約束,再添加新的約束)
暴力解決沖突粤策,使用mas_remakeConstraints
更新約束樟澜,但效率不高。官方推薦還是使用mas_updateConstraints
更新約束。更新約束沖突與否的情況對比如下:
場景1:父子視圖
一秩贰、約束x霹俺、y:
二丙唧、約束centerX、centerY觅玻,分為2種情況:
1.
2.
三、Center分為2種情況:
更新約束:
2.
四、width傻昙、height分為2種情況:
2.
上述設(shè)置的兩種方法均可
更新約束:
綜上所述僻爽,更新約束時需要查看是否為依賴父視圖的約束,是則需要更新之前將原有的約束卸載uninstall贾惦,然后再次添加約束胸梆。
1、x须板、y不受影響
2碰镜、width、height受影響最大习瑰。
一绪颖、設(shè)置約束x、y 2種情況:
1.
更新約束:
結(jié)論:上述設(shè)置會沖突甜奄。
2.
更新約束:
綜上所述:
是否存在依賴關(guān)系课兄,是否改變了依賴關(guān)系牍氛。
第一種情況,更新約束后烟阐,更新的left搬俊、top的約束是相對于父視圖的約束,而在更新之前是相對于brother視圖設(shè)置的約束。從而會產(chǎn)生約束沖突悠抹,需要卸載之前的約束再更新珠月。
第二種情況,更新的約束依然是相對于brother視圖的約束楔敌,只是改變了約束的常量值啤挎,從而并不會產(chǎn)生約束沖突。
二卵凑、設(shè)置width庆聘、height約束分為兩種情況:
更新約束:
結(jié)論:上述設(shè)置不會沖突。
2.
更新約束:
綜上所述,情況與x黑忱、y約束情況一致宴抚,其他情況以此類推!
三甫煞、約束優(yōu)先級
在Masonry中優(yōu)先級:低優(yōu)先級(priorityLow)菇曲、中優(yōu)先級(priorityMedium)、高優(yōu)先級(priorityHigh)抚吠。
默認情況下常潮,Masonry設(shè)置的約束為中級,當在某些特定場景下(很少楷力,有可能父視圖和其他視圖的約束導(dǎo)致喊式,此種情況后續(xù)會跟進。)萧朝,正常設(shè)置約束的情況下岔留,也會出現(xiàn)約束沖突警告,此時可以設(shè)置約束的優(yōu)先級來避免約束沖突警告剪勿。例如:
視圖的width必須為某個值贸诚,但此約束存在約束沖突方庭,此時可以設(shè)置width約束優(yōu)先級為高優(yōu)先級厕吉。