iOS教你轻松打造瀑布流Layout
来源:互联网 发布:长门号战列舰数据 编辑:程序博客网 时间:2024/04/28 03:29
前言 :
在写这篇文章之前, 先祝贺自己, 属于我的GitHub终于来了. 这也是我的GitHub的第一份代码, 以下文章的代码均可以在Demo clone或下载. 欢迎大家给予意见. 觉得写得不错的也请不要吝惜你们的star.
瀑布流
先普及下什么叫瀑布流
瀑布流,又称瀑布流式布局。是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。最早采用此布局的网站是Pinterest,逐渐在国内流行开来。
UICollectionView
我们知道, UICollectionView
是苹果推出的继UITableView
的又一个非常十分及其牛逼的UI控件, 除了有UITableView
的缓存池, 重用机制外, 更能由你自主打造item(tableView中称cell, collectionView中称item)的显示布局, 只要你给它传一个layout布局属性, 他就能按照你的意愿去显示item.
UICollectionViewLayout
这里我就用自定义类JRWaterFallLayout
继承UICollectionViewLayout来写瀑布流布局.
需要手动实现的4个方法
注意 : 因为layoutAttributesForElementsInRect方法调用十分频繁, 所以布局属性的数组应该只计算一次保存起来而不是每次调用该方法的时候重新计算
代理
提供接口给外界修改一些瀑布流布局的参数, 例如显示的列数, 列距, 行距, 边缘距(UIEdgeInsets), 假如代理不实现该方法, 则用默认的参数.. 最最重要的还是item的高度!! 因为每个图片(item)的高度是由图片的宽高比和itemWidth来共同决定的. 所以itemHeight必须由代理来决定.这里展示几个代理方法 :
注意 : 由于上面所说的, layoutAttributesForElementsInRect方法调用十分频繁, 所以代理方法势必也会频繁调用. 但是并不是所有代理方法都是@required的, 所以在调用@optional的代理方法时需要如下代码那样每次都判断代理是否响应了该选择子, 以防代理没有实现该方法, 调用导致程序崩溃
每次都这样判断显然效率很低, 我们可以在prepareLayout方法中进行一次性判断, 然后用一个flags结构体存储起来, 那么下次我们在调用的时候直接对flag进行判断即可. 如下 :
整个瀑布流layout最重要的是找到item摆放的位置. 正是layoutAttributesForItemAtIndexPath
方法要做的是. 下面开始说说找这个item位置的思路
瀑布流layout思路
这里本人一共需要用到2个可变数组和一个assign属性, 一个用来记录每列的高度, 一个用来记录所有itemAttributes. assign用来记录高度最大的列的高度
而在prepareLayout
方法中, 以上2个数组都是要清空的, 因为网络请求的新数据到了, collectionView要重新布局的时候如果不清空, 继续往里边加东西的话, 会导致item的布局就全部乱套了..
接下里要处理的就是layoutAttributesForItemAtIndexPath
方法中每个item该怎么布局了. 思路很简单
- 创建一个UICollectionViewLayoutAttributes对象
- 根据collectionView的width及行间距等几个参数, 计算出item的宽度
- 找到最短列的列号
- 根据列号计算item的x值, y值, 询问代理拿到item的高度
- 设置UICollectionViewLayoutAttributes对象的frame属性
- 返回UICollectionViewLayoutAttributes对象
问题主要出在怎么计算出x, y, width, height上. 看图说话.
详细的计算步骤可以看Demo.
- iOS教你轻松打造瀑布流Layout
- iOS教你轻松打造瀑布流Layout-最好的UICollectionViewDemo
- 手把手教你做开源项目MyMeiZi 二(使用RecyclerView+Glide打造瀑布流)
- IOS瀑布流 通过自定义UICollectionViewController的Layout布局实现
- iOS——教你如何实现瀑布流
- ios让你简单实现瀑布流
- 自定义layout实现瀑布流_UICollectionView
- CollectionView和layout的使用,瀑布流
- 第三方瀑布流layout:UICollectionViewWaterfallLayout
- RecyclerView轻松实现瀑布流效果
- ios瀑布流心得
- iOS 瀑布流
- ios瀑布流心得
- ios瀑布流心得
- iOS 瀑布流实现
- ios 瀑布流
- iOS瀑布流
- iOS UICollectionView瀑布流
- RecyclerView遇到的问题
- 前端异常监控
- Java NIO:浅析I/O模型
- css布局讲解
- vs2013执行Add-Migration出现的问题
- iOS教你轻松打造瀑布流Layout
- Discrete Logging[POJ 2417]
- union 和union all的区别
- 程序员每天、每周、每月、每年该做的事
- 异常解决方案
- NIO 概述
- bugreport_xf.exe 系统错误 丢失LIBEAY32.dll
- DDD CQRS架构和传统架构的优缺点比较
- SLAM papers study summay