UICollectionView解決item之間的間隙問(wèn)題
在項(xiàng)目中需要使用網(wǎng)格組件來(lái)顯示列表信息,因此封裝了一個(gè)iOS的網(wǎng)格組件GridView,demo地址: GitHub
在實(shí)現(xiàn)過(guò)程中發(fā)現(xiàn)一個(gè)問(wèn)題,在iPhone8中,UICollectionView 展示的item之間總有間隙,即使設(shè)置了item等寬,也設(shè)置了UICollectionViewFlowLayout 的 minimumInteritemSpacing 為 0,都不管用,于是Google一番,發(fā)現(xiàn)問(wèn)題普遍存在,做了以下問(wèn)題說(shuō)明和解決辦法
參考文章:UICollectionView 縫隙修復(fù)
簡(jiǎn)要說(shuō)明問(wèn)題產(chǎn)生原因:
1、iPhone中屏幕的 邏輯像素(pt)和 物理像素(px)的對(duì)應(yīng)關(guān)系,在iPhone6s plus(包含)之后都是一個(gè)pt對(duì)應(yīng)3個(gè)px,iPhone4 ~iPhone6s都是一個(gè)pt對(duì)應(yīng)3個(gè)px,從 [[UIScreen mainScrenn] scale] 可以得出對(duì)應(yīng)比例。
2、舉例說(shuō)明:當(dāng)在iPhone8中 UICollectionView 顯示4個(gè)等寬的item時(shí),item的 width 為 375.0/4 = 93.75 (375為iPhone8 邏輯像素寬度), 按照1個(gè)pt由3個(gè)px來(lái)渲染的邏輯,最后的 0.75 只有 0.66 的部分由2個(gè)px渲染,剩下的 0.09沒(méi)法渲染,因此產(chǎn)生了臨近的 1px空白間隙。
解決問(wèn)題:
解決方式與參考文章的做法不同,這里是主動(dòng)規(guī)避。
既然有1px空白間隙,那就避免產(chǎn)生這個(gè)間隙,在計(jì)算 itemSize 的時(shí)候,假設(shè)item等寬為 width,item 的個(gè)數(shù)為 num,除了第一個(gè)item,其他item的寬度都取值 floor(width) ,然后第一個(gè)item 寬度為 CGRectGetWidth(collectionView.bounds) - floor(width) * num ; 這樣就可以避免出現(xiàn)帶小數(shù)寬度,從而沒(méi)了那個(gè)1px空白。
貼一下計(jì)算代碼:
在方法
-(CGSize)collectionView:(UICollectionView )collectionView layout:(UICollectionViewLayout )collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 中寫(xiě)入:
NSInteger num = 4;
CGFloat width = CGRectGetWidth(collectionView.bounds)/num;
CGFloat height = 100.0;
if(indexPath.row == 0){
? ? //第一列的width比其他列稍大一些,消除item之間的間隙
? ? CGFloat realWidth = CGRectGetWidth(collectionView.bounds) - floor(width) * (num - 1);
? ? return CGSizeMake(realWidth, height);
}else{
? ? return CGSizeMake(floor(width), height);
}
原文鏈接:https://blog.csdn.net/ayuapp/article/details/80360745