最近開發(fā)遇到一個問題,如果一個UICollectionView需要等分屏幕時蜡塌,有些情況會出現(xiàn)縫隙的情況碉纳。
iPhone 6 4等分,有兩條縫隙
這個原因是屏幕的最小單位是1像素(1px)岗照,iPhone 6的屏幕寬度是750px村象,750/4=187.5會有小數(shù)點出現(xiàn),不是一個完整的像素攒至,會導(dǎo)致縫隙的出現(xiàn)。
如果消除這些縫隙呢躁劣?這里可以很老套感覺又比較實用的方法迫吐。
在返回每個cell的Size的回調(diào)時,針對每個cell的位置返回不一樣的Size账忘。
計算的邏輯是這樣的志膀,先計算出屏幕的實際寬度,在根據(jù)列數(shù)取模鳖擒,得到的模再分配給左邊的cell溉浙,直到分配完為止,每個cell的高度都取最長的高度蒋荚,防止每一行間也有縫隙戳稽。
最后增加了一個space的參數(shù),可以把每一列的間隔也考慮了期升。每一列的間隔也可以通過UICollectionView的回調(diào)函數(shù)中設(shè)置惊奇。
直接上代碼吧:傳送門
<pre>
/**
- @brief 取模之后再分配多余的像素,去除平分cell的縫隙.
- @param displayWidth 顯示的寬度范圍(一般是屏幕寬度)
- @param col 顯示的列數(shù)
- @param space 列間隔寬度(可以在這里設(shè)置播赁,也可以在collection的回調(diào)函數(shù)中設(shè)置)
- @param indexPath cell的indexPath
- @return 本cell的size
- iPhone 6的屏幕是 750.
- col = 4颂郎,space = 0;
- 750 % 4 = 2容为;
- (750 - 2) = 187;
- 每一行的結(jié)果
- [188,188,187,187];
*/
- (CGSize)fixSizeBydisplayWidth:(float)displayWidth col:(int)col space:(int)space sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
float pxWidth = displayWidth * [UIScreen mainScreen].scale;
pxWidth = pxWidth - space * (col - 1);
int mo = (int)pxWidth % col;
if (mo != 0) {
// 屏幕寬度不可以平均分配
float fixPxWidth = pxWidth - mo;
float itemWidth = fixPxWidth / col;
// 高度取最高的乓序,所以要加1
float itemHeight = itemWidth + 1.0;
if (indexPath.row % col < mo) {
// 模再分配給左邊的cell,直到分配完為止
itemWidth = itemWidth + 1.0;
}
NSNumber *numW = @(itemWidth / [UIScreen mainScreen].scale);
NSNumber *numH = @(itemHeight / [UIScreen mainScreen].scale);
return CGSizeMake(numW.floatValue, numH.floatValue);
}else {
// 屏幕可以平均分配
float itemWidth = pxWidth / col;
return CGSizeMake(itemWidth / [UIScreen mainScreen].scale, itemWidth / [UIScreen mainScreen].scale);
}
}
</pre>
iPhone 6 4等分坎背,沒有縫隙
iPhone 6 11等分替劈,沒有縫隙