转自:https://blog.csdn.net/u012583107/article/details/76044492
实现了对UICollectionView横向滑动的时候UICollectionViewCell横向排列的功能,并带有分组功能
先看下效果图
废话不多说直接上代码
#import <UIKit/UIKit.h>
@interface ELCVFlowLayout : UICollectionViewFlowLayout
@end
- 1
- 2
- 3
- 4
- 5
#import "ELCVFlowLayout.h"
@interface ELCVFlowLayout ()
@property (nonatomic, copy) NSMutableDictionary *sectionDic;
@property (strong, nonatomic) NSMutableArray *allAttributes;
@end
@implementation ELCVFlowLayout
- (instancetype)init
{
self = [super init];
if (self) {
self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
}
return self;
}
- (void)prepareLayout
{
[super prepareLayout];
_sectionDic = [NSMutableDictionary dictionary];
self.allAttributes = [NSMutableArray array];
//获取section的数量
NSUInteger section = [self.collectionView numberOfSections];
for (int sec = 0; sec < section; sec++) {
//获取每个section的cell个数
NSUInteger count = [self.collectionView numberOfItemsInSection:sec];
for (NSUInteger item = 0; item<count; item++) {
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:item inSection:sec];
//重新排列
UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForItemAtIndexPath:indexPath];
[self.allAttributes addObject:attributes];
}
}
}
- (CGSize)collectionViewContentSize
{
//每个section的页码的总数
NSInteger actualLo = 0;
for (NSString *key in [_sectionDic allKeys]) {
actualLo += [_sectionDic[key] integerValue];
}
return CGSizeMake(actualLo*self.collectionView.frame.size.width, self.collectionView.contentSize.height);
}
- (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)attributes
{
if(attributes.representedElementKind != nil)
{
return;
}
/*修改by lixinkai 2017.6.30
下面这两个方法 itemW、itemH
解决了同一个UICollectionView使用不同UICollectionViewCell的问题
*/
//attributes 的宽度
CGFloat itemW = attributes.frame.size.width;
//attributes 的高度
CGFloat itemH = attributes.frame.size.height;
//collectionView 的宽度
CGFloat width = self.collectionView.frame.size.width;
//collectionView 的高度
CGFloat height = self.collectionView.frame.size.height;
//每个attributes的下标值 从0开始
NSInteger itemIndex = attributes.indexPath.item;
CGFloat stride = (self.scrollDirection == UICollectionViewScrollDirectionHorizontal) ? width : height;
//获取现在的attributes是第几组
NSInteger section = attributes.indexPath.section;
//获取每个section的item的个数
NSInteger itemCount = [self.collectionView numberOfItemsInSection:section];
CGFloat offset = section * stride;
//计算x方向item个数
NSInteger xCount = (width / itemW);
//计算y方向item个数
NSInteger yCount = (height / itemH);
//计算一页总个数
NSInteger allCount = (xCount * yCount);
//获取每个section的页数,从0开始
NSInteger page = itemIndex / allCount;
//余数,用来计算item的x的偏移量
NSInteger remain = (itemIndex % xCount);
//取商,用来计算item的y的偏移量
NSInteger merchant = (itemIndex-page*allCount)/xCount;
//x方向每个item的偏移量
CGFloat xCellOffset = remain * itemW;
//y方向每个item的偏移量
CGFloat yCellOffset = merchant * itemH;
//获取每个section中item占了几页
NSInteger pageRe = (itemCount % allCount == 0)? (itemCount / allCount) : (itemCount / allCount) + 1;
//将每个section与pageRe对应,计算下面的位置
[_sectionDic setValue:@(pageRe) forKey:[NSString stringWithFormat:@"%ld", section]];
if(self.scrollDirection == UICollectionViewScrollDirectionHorizontal) {
NSInteger actualLo = 0;
//将每个section中的页数相加
for (NSString *key in [_sectionDic allKeys]) {
actualLo += [_sectionDic[key] integerValue];
}
//获取到的最后的数减去最后一组的页码数
actualLo -= [_sectionDic[[NSString stringWithFormat:@"%ld", [_sectionDic allKeys].count-1]] integerValue];
xCellOffset += page*width + actualLo*width;
} else {
yCellOffset += offset;
}
attributes.frame = CGRectMake(xCellOffset, yCellOffset, itemW, itemH);
}
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
// UICollectionViewLayoutAttributes *attr = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
UICollectionViewLayoutAttributes *attr = [super layoutAttributesForItemAtIndexPath:indexPath].copy;
[self applyLayoutAttributes:attr];
return attr;
}
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{
return self.allAttributes;
}
@end
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
也可以直接下载
https://github.com/elite-kai/ELCVFlowLayout