详解IOS中如何实现瀑布流效果

2020-01-15 17:53:11王冬梅

首先是效果演示

ios瀑布流原理,ios瀑布流demo,ios瀑布流代码

特点:可以自由设置瀑布流的总列数(效果演示为2列)

虽然iphone手机的系统相册没有使用这种布局效果,瀑布流依然是一种很常见的布局方式!!!下面来详细介绍如何实现这种布局.

首先使用的类是UICollectionView

我们要做的是自定义UICollectionViewCell和UICollectionViewLayout

     1、自定义UICollectionViewCell类,只需要一个UIImageView即可,frame占满整个cell.

     2、重点是自定义UICollectionViewLayout,注意一定要继承于UICollectionViewLayout,千万别继承于UIColletionViewFlowLayout.

     3、另外还需要计算图片高度.

为什么要自定义UICollectionViewLayout ?

因为我们需要设置每个item的高度以及位置, 注意这里是位置, 我们真的会设置每个item的位置的相信我!!!自定义UICollectionViewLayout必须要重写三个协议方法,后面会讲到.

为什么要计算图片高度 ?

因为图片宽度固定,所以需要按照图片的比例来计算高度,使图片等比例显示.这样的好处是,妈妈再也不用担心我的照片被拉伸的奇形怪状了...而且还需要用图片的高度来计算整个CollectionView的contentSize...打完收工!!!

主菜来了!!!

以下内容均在自定义的CustomCollectionViewLayout类里边


//自定义UICollectionViewLayout必须要重写的三个协议方法
//1.计算每个item的大小和位置
- (void)prepareLayout;
//2.返回每个item的布局属性
- (nullable NSArray<__kindof UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect;
//3.返回collectionView的总高度
- (CGSize)collectionViewContentSize;

可以看到第三个方法使用了Nullability和泛型,系统的方法都添加了iOS 9新特性。

通过上边的三个方法名我们可以大致了解需要去做什么.说一下第二个方法,需要返回一个数组,数组存放布局属性(UICollectionViewLayoutAttributes)对象.那么我们需要写一个属性数组(attributesArray),将布局属性放入这个属性数组并返回.

ios瀑布流原理,ios瀑布流demo,ios瀑布流代码

还需要什么呢 ?看了文章开头的朋友应该注意到了,设置瀑布流的列数当然得有个属性(numberOfColumns)来表示列数.

请注意,因为要在外部设置列数,所以这个属性需要写在自定义类的.h文件中

另外为了方便,定义一个属性(itemWidth)来表示item的宽度

再定义一个属性(contentHeight)来表示整个collectionView的contenView的高度