首页
登录 | 注册

iOS开发:瀑布流效果的实现(使用UICollectionView)

效果的实现,主要是对UICollectionViewLayout进行封装,我的.h文件中:

#import  @class CustomeViewLayout; @protocol CustomViewLayoutDelegate <NSObject> /**
 计算item高度的代理方法,将item的高度与indexPath传给外界
 */ - (CGFloat)customFallLayout:(CustomeViewLayout *)customFallLayout itemHeightForWidth:(CGFloat)itemWidth atIndexPath:(NSIndexPath *)indexPath; @end //实现了瀑布流功能,但是不能添加头部和底部视图,如项目中有添加头部或底部视图的需求,请慎用!!! @interface CustomeViewLayout : UICollectionViewLayout /**
 总列数,默认是2
 */ @property (nonatomic, assign) NSInteger columnCount; /**
 列间距,默认是0
 */ @property (nonatomic, assign) float columnSpacing; /**
 行间距,默认是0
 */ @property (nonatomic, assign) float rowSpacing; /**
 section与CollectionView的间距,上、左、下、右,默认是(0, 0, 0, 0)
 */ @property (nonatomic, assign) UIEdgeInsets sectionInset; /**
 同时设置列间距、行间距、sectionInset

 @param columnSpacing 列间距
 @param rowSpacing 行间距
 @param sectionInset 设置上、左、下、右的距离
 */ - (void)setColumnSpacing:(float)columnSpacing rowSpacing:(float)rowSpacing sectionInset:(UIEdgeInsets)sectionInset; #pragma mark ====== 代理方法、block二选其一 ====== /**
 一下代理属性与block属性二选其一,用来设置每一个item的高度
 会将item的高度与indexPath传递给外界
 如果两个都设置,block的优先级高,即代理无效
 */ /**
 代理方法,用来计算item的高度
 */ @property (nonatomic, assign) id delegate; /**
 计算item高度的block,将item的高度与indexPath传递给外界
 */ @property (nonatomic, strong) CGFloat(^itemHeightBlock)(CGFloat itemHeight, NSIndexPath *indexPath); #pragma mark ====== 构造方法 ====== + (instancetype)customFallLayoutWithColumnCount:(float)columnCount;
- (instancetype)initWithColumCount:(float)columnCount; @end

上面的文件主要是给外界提供一个接口,可以设置行数、行间距、列间距

实现的文件中,主要是找到UICollectionView中,最短的列数的最大Y值,把后面需要添加的item添加到这一列的下面,主要代码如下:

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath { //根据indexPath获取item的attributes UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; //获取collectionView的宽度 CGFloat collectionViewWidth = self.collectionView.frame.size.width; //item的宽度 = (collectionView的宽度 - 内边距与列间距) / 列数 CGFloat itemWidth = (collectionViewWidth - self.sectionInset.left - self.sectionInset.right - (self.columnCount - 1) * self.columnSpacing) / self.columnCount; CGFloat itemHeight = 0; //获取item的高度,由外界计算得到 if (self.itemHeightBlock) {
        itemHeight = self.itemHeightBlock(itemWidth, indexPath);
    } else { if ([self.delegate respondsToSelector:@selector(customFallLayout:itemHeightForWidth:atIndexPath:)]) {
            itemHeight = [self.delegate customFallLayout:self itemHeightForWidth:itemWidth atIndexPath:indexPath];
        }
    } //找出最短的那一列 __block NSNumber *minIndex = @0;
    [self.maxYDic enumerateKeysAndObjectsUsingBlock:^(NSNumber *key, NSNumber *obj, BOOL *stop) { if ([self.maxYDic[minIndex] floatValue] > obj.floatValue) {
            minIndex = key;
        }
    }]; //根据最短列的列数计算item的x值 CGFloat itemX = self.sectionInset.left + (self.columnSpacing + itemWidth) * minIndex.integerValue; //item的y值 = 最短列的最大y值 + 行间距 CGFloat itemY = [self.maxYDic[minIndex] floatValue] + self.rowSpacing; //设置attributes的frame attributes.frame = CGRectMake(itemX, itemY, itemWidth, itemHeight); //更新字典中的最大y值 self.maxYDic[minIndex] = @(CGRectGetMaxY(attributes.frame)); return attributes;
}

具体实现请看demo,
demo下载地址


相关文章

  • 直播APP开发之iOS开发中的列表优化思路
    APP开发中,列表可能是平时我们打交道最多的UI控件之一,其重要性不言而喻,对其性能的优化同样至关重要.而对于iOS开发,列表就是我们常说的UITableView / UICollectionView.在进行直播APP开发时针对于列表的优化 ...
  • 6年iOS开发被裁员,是行业的饱和还是经验根本不值钱?
    最近看到很多iOS开发由于公司裁员而需要重新求职的.他们普遍具有4年甚至更长的工作经验.但求职结果往往都不太理想. 由于工作年限较长,他们普遍认为工资就是应该随着工作年限增长而不断提升的.但事实却是:你的工资不是和你的工作年限成正比,而是和 ...
  • 每个人的都有独特的经历,因此会有特别的事情会让ta感到快乐,并享受做自己喜欢的事情.写程序也不例外,我在很年轻的时候就明白这点,它成为我开始创业的无形资产.写程序的渴望来自我想完整独立做一件事情的渴望,做移动开发,可以让我不依赖任何人就能学 ...
  • 首先你要花点时间针对objective-c语言的学习:毕竟这个是iOS开发的基础(你也可以尝试用Swift,但此项目只是针对OC),编程套路其实都是差不多,多写多想多实践:关于环境的搭建就不在本文进行介绍,这部分内容可以自行百度或谷歌,都有 ...
  • 作为从事 iOS 开发好几年的开发者,我见识过 2013-2014 年移动端大热时的疯狂,见识过 2016 年一个 iOS 岗位对应千封简历的疯狂. 那种培训班三个月出来都能找份月薪过万的工作的事情早就是上古神话了.但是,这只不过意味着志向 ...
  • 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了. 由于我面试公司比较多,所以自然也是做了这方面的准备,因此这篇总结并不一定适合想去创业公司的同学.另外,由于经验本来就是主观性极强的东西,加之笔者水平有限,所以如果有不认可的地 ...

2019 unjeep.com webmaster#unjeep.com
12 q. 0.013 s.
京ICP备10005923号