iOS开发:瀑布流效果的实现(使用UICollectionView)
程序员文章站
2022-04-13 12:08:41
...
iOS开发:瀑布流的实现
效果的实现,主要是对UICollectionViewLayout进行封装,我的.h文件中:
#import <UIKit/UIKit.h>
@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<CustomViewLayoutDelegate> 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添加到这一列的下面,主要代码如下: