关于UICollectionView横向分页滚动,cell左右排版功能的实现
2017-07-25 09:37
1651 查看
实现了对UICollectionView横向滑动的时候UICollectionViewCell横向排列的功能,并带有分组功能
先看下效果图
废话不多说直接上代码
也可以直接下载
https://github.com/elite-kai/ELCVFlowLayout
先看下效果图
废话不多说直接上代码
#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占了几页 NS 993b Integer 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
相关文章推荐
- 横向分页滚动的UICollectionView,cell左右排版 支持多组Cell实现。
- iOS - Swift UICollectionView横向分页滚动,cell左右排版
- 横向分页滚动的UICollectionView,cell左右排版
- iOS Swift UICollectionView横向分页滚动,cell左右排版问题详解
- iOS使用EGO实现UITableView或UICollectionView横向分页刷新
- IOS中通过UICollectionView和UICollectionViewFlowLayout设置初始游标cursor来控制左右滑动来实现多条记录水平分页显示及控制音标读音
- 通过UICollectionView实现横向滚动照片效果
- iOS 利用UICollectionView横向滚动、余弦函数曲线特性实现居中放大的卡片浏览工具 XLCardSwitch
- RecyclerView实现横向分页滚动效果,欢迎大家前来交流
- iOS中UICollectionView实现单个cell滚动翻页并放大cell
- [iOS]UICollectionView循环滚动功能的实现思路
- Swift 自定义 UICollectionViewFlowLayout 实现横向布局分页
- Android不继承ViewPager实现自动滚动翻页功能
- TextView 实现横向滚动的方法
- 关于android TextView在不需要较焦点的情况下,自动滚动文本实现小技巧
- (四)使用PagerSlidingTabStrip和ViewPager实现可左右滑动和点击效果功能
- TextView单行显示,文字左右滚动(走马灯效果)实现条件:
- iOS - UICollectionView 简单拖动 cell 实现
- Android 自定义 HorizontalScrollView 实现图片左右滚动按钮控制
- UICollectionViewCell水平缩放,中间大两边小效果的实现