解決UICollectionView的cell間距與設(shè)置不符問題
在用UICollectionView展示數(shù)據(jù)時陶夜,有時我們希望將cell的間距調(diào)成一個我們想要的值盯滚,然后查API可以看到有這么一個屬性:
list text here
(CGFloat)minimumInteritemSpacing { return 0; }
然而很多情況下我們會發(fā)現(xiàn),這樣寫不能滿足我們的要求,cell之間仍然有一個不知道怎么產(chǎn)生的間距。
我們知道cell的間距是由cell的大小itemSize和section的縮進(jìn)sectionInset共同決定的,通過這兩個數(shù)據(jù)而姐,UICollectionView動態(tài)地將cell放在相應(yīng)的位置,然而即使我們接著調(diào)用inset方法也沒有用划咐。
(UIEdgeInsets)sectionInset { return UIEdgeInsetsMake(0, 0, 0, 0); }
<注:我想實現(xiàn)的是0間距拴念,其他情況類似>
可以看到,繼承UICollectionViewFlowLayout后在- layoutAttributesForElementsInRect:方法中打印一下這些cell的frame的結(jié)果
-(NSArray)layoutAttributesForElementsInRect:(CGRect)rect { NSMutableArrayattributes = [[super layoutAttributesForElementsInRect:rect] mutableCopy];
for(UICollectionViewLayoutAttributes *attrinattributes) {NSLog(@"%@", NSStringFromCGRect([attr frame]));}
}
從上面兩行就可以看出來褐缠,我的高度是42.8政鼠,然而兩個cell的x值間距卻為46,也就是說有大約3px的間距队魏。 其實缔俄,正如minimumInteritemSpacing的名字一樣,這個屬性設(shè)置的是間距的最小值,那么俐载,我們實際需要的應(yīng)該是一個"maximumInteritemSpacing"蟹略,也就是最大間距。要解決這個問題遏佣,需要自己做一些計算挖炬。
依舊是繼承UICollectionViewFlowLayout,然后在- layoutAttributesForElementsInRect:方法中添加如下代碼:
//從第二個循環(huán)到最后一個 for(int i = 1; i < [attributes count]; ++i) { //當(dāng)前attributes UICollectionViewLayoutAttributescurrentLayoutAttributes = attributes[i]; //上一個attributes UICollectionViewLayoutAttributesprevLayoutAttributes = attributes[i - 1]; //我們想設(shè)置的最大間距状婶,可根據(jù)需要改 NSInteger maximumSpacing = 0; //前一個cell的最右邊 NSInteger origin = CGRectGetMaxX(prevLayoutAttributes.frame); //如果當(dāng)前一個cell的最右邊加上我們想要的間距加上當(dāng)前cell的寬度依然在contentSize中意敛,我們改變當(dāng)前cell的原點(diǎn)位置 //不加這個判斷的后果是,UICollectionView只顯示一行膛虫,原因是下面所有cell的x值都被加到第一行最后一個元素的后面了 if(origin + maximumSpacing + currentLayoutAttributes.frame.size.width < self.collectionViewContentSize.width) { CGRect frame = currentLayoutAttributes.frame; frame.origin.x = origin + maximumSpacing; currentLayoutAttributes.frame = frame; } }