.h
HTCollectionViewLayout : UICollectionViewFlowLayout
HTCollectionViewLayoutAttributes:UICollectionViewLayoutAttributes
HTCollectionReusableView :UICollectionReusableView
@protocol HTCollectionViewLayoutDelegate <UICollectionViewDelegateFlowLayout>
// Section 背景颜色
@optional
-(UIColor *)collectionview:(UICollectionView *)collectionView colorForSection:(NSInteger)section;
@end
.m
- (void)prepareLayout{
[super prepareLayout];
[self registerClass:[HTCollectionReusableView class] forDecorationViewOfKind:@"HTCollectionReusableView"];
// 获取组数
NSInteger sections = [self.collectionView numberOfSections];
// 获取代理对象
__strong id<HTCollectionViewLayoutDelegate> delegate = self.collectionView.delegate;
// 是否实现代理方法
if ([delegate respondsToSelector:@selector(collectionview:colorForSection:)]) {
[self.decorationViewAttrs removeAllObjects];
// 遍历组
for(NSInteger section = 0;section<sections;section ++){
// 获取Item数
NSInteger numberOfItems = [self.collectionView numberOfItemsInSection:section];
if(numberOfItems >0){
// 获取第一个item Attributes
UICollectionViewLayoutAttributes *fristAttributes = [self layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:section]];
UICollectionViewLayoutAttributes *lastAttrbutes = [self layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForRow:(numberOfItems - 1) inSection:section]];
// 获取最小包含frame
CGRect sectionFrame = CGRectUnion(fristAttributes.frame, lastAttrbutes.frame);
if (self.scrollDirection == UICollectionViewScrollDirectionHorizontal) {
sectionFrame.size.height = self.collectionView.frame.size.height;
}else{
sectionFrame.size.width = self.collectionView.frame.size.width;
}
HTCollectionViewLayoutAttributes *attr = [HTCollectionViewLayoutAttributes layoutAttributesForDecorationViewOfKind:@"HTCollectionReusableView" withIndexPath:[NSIndexPath indexPathForItem:0 inSection:section]];
attr.frame = sectionFrame;
attr.zIndex = -1;
attr.backgroudColor = [delegate collectionview:self.collectionView colorForSection:section];
[self.decorationViewAttrs addObject:attr];
}
}
}else{
return ;
}
}
-(NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{
NSMutableArray *attrs = [NSMutableArray array];
[attrs addObjectsFromArray:[[super layoutAttributesForElementsInRect:rect] mutableCopy]];
for(UICollectionViewLayoutAttributes *attr in self.decorationViewAttrs){
if(CGRectIntersectsRect(rect, attr.frame)){
[attrs addObject:attr];
}
}
return attrs;
}
@implementation HTCollectionReusableView
-(void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes{
[super applyLayoutAttributes:layoutAttributes];
HTCollectionViewLayoutAttributes *attr = (HTCollectionViewLayoutAttributes *)layoutAttributes;
self.backgroundColor = attr.backgroudColor;
}