关于UICollectionView横向分页滚动,cell左右排版功能的实现
来源:互联网 发布:野火网络 编辑:程序博客网 时间:2024/05/22 12:43
实现了对UICollectionView横向滑动的时候UICollectionViewCell横向排列的功能,并带有分组功能
先看下效果图
废话不多说直接上代码
#import <UIKit/UIKit.h>@interface ELCVFlowLayout : UICollectionViewFlowLayout@end
#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
也可以直接下载
https://github.com/elite-kai/ELCVFlowLayout
阅读全文
0 0
- 关于UICollectionView横向分页滚动,cell左右排版功能的实现
- 横向分页滚动的UICollectionView,cell左右排版
- 横向分页滚动的UICollectionView,cell左右排版 支持多组Cell实现。
- iOS - Swift UICollectionView横向分页滚动,cell左右排版
- 通过UICollectionView实现横向滚动照片效果
- iOS - Swift UICollectionView横向分页的问题
- [iOS]UICollectionView循环滚动功能的实现思路
- [iOS]UICollectionView循环滚动功能的实现思路
- iOS使用EGO实现UITableView或UICollectionView横向分页刷新
- iOS 关于UICollectionView的cell重用问题
- UICollectionview实现自定义cell的移动删除
- UICollectionView滚动到指定cell的机制问题
- 文字横向滚动的实现
- 文字横向滚动的实现
- iOS 利用UICollectionView横向滚动、余弦函数曲线特性实现居中放大的卡片浏览工具 XLCardSwitch
- 负margin实现div的左右排版
- 点击左右横向滚动,很简单的代码哦
- iOS中UICollectionView实现单个cell滚动翻页并放大cell
- LeetCode-27-Remove Element(消除数组中给定的元素)
- java 中的process类
- 13:大整数的因子
- git特性使用
- css样式片段
- 关于UICollectionView横向分页滚动,cell左右排版功能的实现
- c++ 内联函数(一看就懂)
- ES存储的时间问题
- 二维码功能实现
- angularJS 修改对象B与传值对象A指向同一个内存区 怎么让他们不再绑定?
- 【OSG】将显示的图形窗口化
- 素数筛法
- Professional JS(10.1.4--end)剩余类型&DOM操作技术&黑画--一百年后的编程语言
- 大数加减乘法(Java)