UICollectionViewFlowLayout
是蘋果為我們實(shí)現(xiàn)的一個(gè)布局垒拢,它有兩個(gè)屬性可以設(shè)置cell之間的間距:minimumLineSpacing 設(shè)置最小行間距旬迹,minimumInteritemSpacing 設(shè)置同一列中間隔的cell最小間距。
為什么是最小求类,而不是固定的間距呢奔垦?因?yàn)?FlowLayout 的實(shí)現(xiàn)是兩端對(duì)齊,同時(shí)保持一列中的cell間距相等尸疆。
像這樣的:
可以看到椿猎,一列中的cell總是兩端和collectionView對(duì)齊惶岭,cell之間的間隔一致。
需求
那么現(xiàn)在有一個(gè)需求就是鸵贬,不想要兩端對(duì)齊俗他,而是左對(duì)齊脖捻。cell根據(jù)間距和size阔逼,從左往右一個(gè)個(gè)的排,排不下了換一行地沮。
像這樣的:
這里引入一個(gè) maximumInteritemSpacing 的屬性嗜浮。這個(gè)屬性和 minimumInteritemSpacing 類似,用來設(shè)置兩個(gè)同一列的相鄰的cell之間的最大間距摩疑。
相鄰的cell之間的實(shí)際間距 spacing 總是要滿足:
minimumInteritemSpacing <= spacing <= maximumInteritemSpacing
實(shí)現(xiàn)
1:創(chuàng)建一個(gè) UICollectionViewFlowLayout 子類 CustomFlowLayout
@interface CustomFlowLayout : UICollectionViewFlowLayout
@property (nonatomic) CGFloat maximumInteritemSpacing;
@end
2:在CustomerFlowLayout的實(shí)現(xiàn)里危融,由于系統(tǒng)已經(jīng)幫我們做了全部的計(jì)算的事情。所以我們只需要重寫 -layoutAttributesForElementsInRect: 這個(gè)方法即可雷袋。并不需要重寫其他方法吉殃。
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{
//使用系統(tǒng)幫我們計(jì)算好的結(jié)果。
NSArray *attributes = [super layoutAttributesForElementsInRect:rect];
//第0個(gè)cell沒有上一個(gè)cell楷怒,所以從1開始
for(int i = 1; i < [attributes count]; ++i) {
//這里 UICollectionViewLayoutAttributes 的排列總是按照 indexPath的順序來的蛋勺。
UICollectionViewLayoutAttributes *curAttr = attributes[i];
UICollectionViewLayoutAttributes *preAttr = attributes[i-1];
NSInteger origin = CGRectGetMaxX(preAttr.frame);
//根據(jù) maximumInteritemSpacing 計(jì)算出的新的 x 位置
CGFloat targetX = origin + _ maximumInteritemSpacing;
// 只有系統(tǒng)計(jì)算的間距大于 maximumInteritemSpacing 時(shí)才進(jìn)行調(diào)整
if (CGRectGetMinX(curAttr.frame) > targetX) {
// 換行時(shí)不用調(diào)整
if (targetX + CGRectGetWidth(curAttr.frame) < self.collectionViewContentSize.width) {
CGRect frame = curAttr.frame;
frame.origin.x = targetX;
curAttr.frame = frame;
}
}
}
return attributes;
}
當(dāng)然,maximumInteritemSpacing 應(yīng)該有一個(gè)默認(rèn)值:
- (void)awakeFromNib
{
[super awakeFromNib];
self. maximumInteritemSpacing = 8.f;
}
使用方法
CustomFlowLayout 可以在xib和storyboard中使用鸠删。你往控制器里拖進(jìn)去一個(gè)UICollectionView時(shí)會(huì)自動(dòng)攜帶一個(gè) UICollectionViewFlowLayout抱完,修改它的類名為 CustomerFlowLayout 即可。