缘由:前几日朋友面试的时候被问到如何写一个瀑布流,然后将照片什么的文件打包成bundle,最后上传cocoaPod,如何定义接口,如何制作内部
很久之前就想写了,一直没有动笔,现在想想,可以做一个自己第三方库,pod一下,将来好升级,慢慢学习制作轮子
基本思路:
1.定义接口
1.1 定义数据源接口,注意点:一共多少个数据,每个数据显示成什么样的cell
1.2 定义代理方法,注意:cell的点击事件,cell的边距,cell的高度
1.3 刷新接口,每一次获取了新的数据,要去刷新的
2.内部实现
2.1 刷新接口 reloadData
中的逻辑实现
2.2 获取一共有多少数据
2.3 获取基本的左右上下的边距
2.4 计算cell 的宽度
2.5 保存所有列的最短index,和高度
2.6 计算cell的frame
2.7 for将新的cell添加到最短的列中,更新列的高度
2.8 设置scrollview.contentSize
3.优化
3.1 复用cell
3.2 给cell一个复用属性
3.3 给WaveFlowView一个方法,用于获取缓存池中的cell
4.写好一个demo
4.1 获取一个plist文件,在项目中直接使用
5.如何将默认图片打成一个bundle
6.将文件上传到github上
7.将文件上传到cocoapod上
详细的讲解一下思路和步骤
1.定义接口
1.1 定义数据源接口
@objc
protocol WaterFlowViewDataSource:NSObjectProtocol {
/// cell的总数
func numberOfCells(_ waterFlowView:WaterFlowView) -> Int
/// 在indexPath位置上的cell的样式
func waterFlowView(_ waterFlowView:WaterFlowView,cellForRowAt index: NSInteger) -> WaterFlowCell
/// 瀑布流一共几列,默认3列
@objc optional func numberOfColums(_ waterFlowView: WaterFlowView) -> Int
}
1.2 定义代理方法
@objc
protocol WaterFlowViewDelegate:UIScrollViewDelegate{
/// 每个cell返回的高度
@objc optional func waterFlowView(_ waterFlowView:WaterFlowView,heightForRowAt index:NSInteger,cellWidth width:CGFloat) -> CGFloat
/// 间距
@objc optional func waterFlowView(_ waterFlowView:WaterFlowView,marginType:WaterFlowViewMarginType) -> CGFloat
/// 点击每个cell
@objc optional func waterFlowView(_ waterFlowView:WaterFlowView,didSelectForRowAt index:NSInteger)
}
1.3 枚举类型,用来表示那个间距
var WFScreenWidth = UIScreen.main.bounds.width
public let kWaterFlowViewDefaultMargin:CGFloat = 10.0
@objc enum WaterFlowViewMarginType:Int{
case top
case left
case bottom
case right
case columns
case row
}
1.4 每次要手动刷新的方法
public func reloadData()
2.内部实现
写完了大家通用的接口,我们去看看内部具体的计算方法