demo中采用的大都是工裝圖,畢竟我是喜歡工裝的農(nóng)民工。(猜猜哪個(gè)是我)
最近在用CollectionView寫一個(gè)可以自動(dòng)識別文字和圖片高度的瀑布流。
在cell中根據(jù)當(dāng)前cell寬度用Masonry設(shè)置image的寬、高的時(shí)候,在沒有滑動(dòng)界面的時(shí)候是沒問題的。如圖所示:


但是當(dāng)我滑動(dòng)Collectionview,就發(fā)現(xiàn)報(bào)錯(cuò),并且圖片顯示也出現(xiàn)問題,寬度跟cell寬度并不一樣:


報(bào)錯(cuò):
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.?
MASLayoutConstraint:0x6000000b0c80 UIImageView:0x7fe9f6f4f1e0.height == 65.9022
MASLayoutConstraint:0x6040000a9b40 UIImageView:0x7fe9f6f4f1e0.height == 177.5
根據(jù)打印結(jié)果大概知道是設(shè)置了兩次UIimageview的高度,出現(xiàn)了約束沖突,但從代碼上看來我只設(shè)置了一次,網(wǎng)上查了下類似的問題,但是解決辦法都是說設(shè)置約束的優(yōu)先級priority(),我設(shè)置之后雖然不報(bào)錯(cuò),但是圖片顯示還是有問題。
最后發(fā)現(xiàn)是因?yàn)閏ell復(fù)用,復(fù)用的cell中的imgView控件仍含有之前設(shè)置的約束,所以就產(chǎn)生沖突了。
知道了問題在哪就好辦了,在cell中設(shè)置image的時(shí)候,先取得imgView的所有約束,然后刪除,最后重新設(shè)置約束,就沒問題了。(本來想做個(gè)判斷,只在復(fù)用的cell中刪除約束,但暫時(shí)還不知道如何拿到復(fù)用的cell,所以就直接對所有cell進(jìn)行操作)代碼如下:

修改之后圖片顯示就沒問題了

當(dāng)然,取消cell復(fù)用也是可以的,但是當(dāng)數(shù)據(jù)量過多的時(shí)候,內(nèi)存會(huì)過大,所以不考慮這種方法了。
另附瀑布流demo地址:CollectionView瀑布流