iOS 自从出了UICollectionview之后,界面的样式可谓更加的多元化,对于一些较为复杂的界面UICollectionview都可以相对轻松的实现,而且由于其 FlowLayout 子类的存在,界面的布局更可谓是随心所欲,下面就来介绍下在处理图片中比较爱用到的瀑布流,我这里和一些其他人的方法不一样,我是重写了它的一个类来实现的瀑布流,那么废话不多说,直接上 Demo
首先我们需要创建一个类,基于UICollectionViewLayout 然后重写系统的协议方法
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;
获取每个 item 的大小 ( 如果不重写的话 , 在当前的 .m 文件里得不到 size, 没有代理人去调用该方法得到 size)
这里为.h的代码:
@protocol myCollectionFlowLayoutDelegate <NSObject>
//重写系统的协议方法 获取每个item的大小 (如果不重写的话,在当前的.m文件里得不到size,没有代理人去调用该方法得到size)
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;
@end
@interface myCollectionFlowlayout : UICollectionViewLayout
@property (nonatomic ,assign)id <myCollectionFlowLayoutDelegate>myCollectionFlowLayout;
@property (nonatomic ,retain)NSMutableArray *array;
@property (nonatomic ,assign)CGFloat maxHiget;
@property (nonatomic ,retain)UICollectionViewLayoutAttributes *attributes;
下面为.m 里的代码:
//重写系统prepareLayout方法,准备布局item之前会调用
- (void)prepareLayout{
[super prepareLayout];
//重新设置滚动范围时用
self.maxHiget = 0;
//用来存放item的属性
self.array = [NSMutableArray array];
//设置每列item y坐标的初始值
CGFloat LeftY = 60,MidY = 60,ReightY = 60;
//计算contentView 第一步
CGFloat maxLeft = 0,maxMid = 0 ,maxRight = 0