瀑布流布局提供了一种在有限的视图区域内尽可能多的展示更多的内容,它可以摒弃掉iOS默认布局(UICollectionViewFlowLayout)的不规整的缺点。百度图片就是使用的横向的流式布局方式:虽然图片的size各有不同,通过把他们约束在相同高度、不同长度的视图内(高度一定,等比例缩放长度),实现规整的排列。
iOS中实瀑布流有很多方式:多列UITableView、使用UIScrollView等等,但最常见的还是实现继承于UICollectionViewLayout的子类,自定义布局方式。在Code4App网站上一搜就能搜到很多,而且都是封装好的类直接可以拿来用。鉴于此这里只以一个简单例子介绍实现瀑布流的三个关键方法。
创建一个UICollectionViewLayout的子类:CustomViewLayout。
在.h 文件中添加两个属性:int型的m_numberOfColums 用于记录视图中有几列,float型的m_interItemSpacing用于记录图片视图之间的间距。在定义一个向使用改布局的UICollectionView对象的协议方法。这是.h文件应该是这样的:
#import <UIKit/UIKit.h>
@class CustomViewLayout;
@protocol CustomViewLayoutDelegate <NSObject>
//--向代理询问每个item的高度的协议方法--
- (float)collectionView:(UICollectionView *)view layout:(CustomViewLayout *)layout heightForItemAtIndexPath:(NSIndexPath *)indexPath;
@end
@interface CustomViewLayout : UICollectionViewLayout
@property (nonatomic,assign)int m_numberOfColums;
@property (nonatomic,assign)float m_interItemSpacing;
@end
在.m文件中添加两个属性:NSMutableArray类型的m_allItemAttributeArray 用于存储每个视图的布局信息(LayoutAttributes),NSMutableDictionary类型的m_everyColumsHeightDic 用于存储每列的最新高度,每次新加入一个视图时将向该字典询问最短的列,根据最短列的高度生成该视图的布局信息然后更