iOS开发瀑布流的实现
//自定义布局,继承于UICollectionViewLayout
#import <UIKit/UIKit.h>
@class WaterFlowLayout;
@protocol WaterFlowLayoutDeleagre ;
@interface WaterFlowLayout : UICollectionViewLayout
@property (nonatomic,weak)id<WaterFlowLayoutDeleagre>delegate;
@end
@protocol WaterFlowLayoutDeleagre <NSObject>
@required
- (CGFloat)collectionView:(__kindof UICollectionView *)collectionView heightForItemAtIndexPath:(NSIndexPath *)indexPath;
@end
-------------------------------------------------------------------------
#import "WaterFlowLayout.h"
static CGFloat const coloumMarginDefault = 10; //间隙
static NSInteger const coloumDefault = 3; //这里可以更改列数
static CGFloat const rowMaginDegault = 10; //行之间的间隙
@interface WaterFlowLayout ()
@property (nonatomic,strong)NSMutableArray * attris;
@property (nonatomic,strong)NSMutableArray * cloumsHeight;
@end
@implementation WaterFlowLayout
//记录没列cell的最大Y值
- (NSMutableArray *)cloumsHeight
{
if (_cloumsHeight == nil) {
_cloumsHeight = [NSMutableArray array];
}
return _cloumsHeight;
}
//存放每个cell的属性值
- (NSMutableArray *)attris
{
if (_attris == nil) {
_attris = [NSMutableArray array];
}
return _attris;
}
//准备开始布局
- (void)prepareLayout
{
[super prepareLayout];
//布局开始之前清空所有的列高度
[self.cloumsHeight removeAllObjects];
//为列高度添加初始值
for (int i=0; i<coloumDefault; i++) {
[self.cloumsHeight addObject:@0];
}
//获取对应组的cell个数
NSInteger count = [self.collectionView numberOfItemsInSection:0];
NSMutableArray * atts = [NSMutableArray array];
//创建cell的布局属性
for (int i=0; i<count; i++) {
//获取collectionview中对应indexpath的cell属性
UICollectionViewLayoutAttributes * attributes = [self layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForItem:i inSection:0]];
[atts addObject:attributes];
}
self.attris = atts;
}
- (nullable NSArray<__kindof UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{
//返回所有cell的布局属性
return self.attris;
}
- (UICollectionViewLayoutAttributes*)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
//初始化布局属性
UICollectionViewLayoutAttributes * attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
//让纪律每列高度中的数组的第一个数据为最小值
CGFloat minHeight = [self.cloumsHeight[0] floatValue];
//记录的列号
NSInteger cloum =0;
//取出最小高度的列
for ( NSInteger i=1; i<self.cloumsHeight.count; i++) {
if (minHeight > [self.cloumsHeight[i] floatValue]) {
minHeight = [self.cloumsHeight[i] floatValue];
cloum =i;
}
}
//计算宽度
CGFloat W = (self.collectionView.frame.size.width - coloumMarginDefault * (coloumDefault + 1))/ coloumDefault;
//计算高度
CGFloat H = [self.delegate collectionView:self.collectionView heightForItemAtIndexPath:indexPath];
//计算cell的x值
CGFloat X = coloumMarginDefault + (W + coloumMarginDefault) *cloum;
//计算cell的Y值
CGFloat Y = minHeight + rowMaginDegault;
attributes.frame = CGRectMake(X, Y, W, H);
//更新记录每列高度的数组
[self.cloumsHeight replaceObjectAtIndex:cloum withObject:@(CGRectGetMaxY(attributes.frame) )];
return attributes;
}
//返回collectionview的滚动范围
- (CGSize)collectionViewContentSize
{
CGFloat maxHeight = 0;
for (int i=0; i<self.cloumsHeight.count; i++) {
if (maxHeight < [self.cloumsHeight[i] floatValue]) {
maxHeight =[self.cloumsHeight[i] floatValue];
}
}
return CGSizeMake(0, maxHeight);
}
@end
-----------------------------------------------------------------------------------------------如此即可------------------------------------------------
iOS开发瀑布流的实现的更多相关文章
- ios开发瀑布流框架的应用
一:瀑布流框架的应用:将封装好的瀑布流框架导入,遵守协议 二:代码: #import "HMShopsViewController.h" #import "HMShopC ...
- ios开发瀑布流框架的封装
一:瀑布流框架封装的实现思路:此瀑布流框架的封装仿照tableView的底层实现,1:每个cell的frame的设置都是找出每列的最大y值,比较每列的最大y值,将下一个cell放在最大y值最小的那一列 ...
- iOS基础 - 瀑布流
一.瀑布流简介 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早采用此布局的网站是Pint ...
- iOS横向瀑布流的封装
前段时间, 做一个羡慕, 需要使用到瀑布流! 说道瀑布流, 或许大家都不陌生, 瀑布流的实现也有很多种! 从scrollView 到 tableView 书写的瀑布流, 然后再到2012年iOS6 苹 ...
- ios图片瀑布流代码
ios瀑布流,实现简单的瀑布流视图布局,可以显示网络图片,下拉刷新,上拉加载更多. 下载:http://www.huiyi8.com/sc/9087.html
- iOS - UICollectionView 瀑布流 添加表头视图的坑
UICollectionView 瀑布流 添加表头视图的坑 首先是,需求加了个头视图在顶部,在collectionView中的头视图跟TableView的不一样,TableView的表头只要设置tab ...
- 堆糖瀑布流完整解决方案(jQuery)
2010年堆糖创办以来,网站界面经历过3-5次重大改版,logo也曾更换过两次,早期蓝红相间三个圈的logo恐怕很少有人记得了.与此同时,前端 js 框架也在默默的更新换代.最早堆糖上线时,js 采用 ...
- jQuery动态网格瀑布流插件Masonry
Masonry是一款非常强大的jQuery动态网格布局插件,可以帮助开发人员快速开发瀑布流界面效果.和CSS中float的效果不太一样的地方在于,float先水平排列,然后再垂直排列,使用Masonr ...
- iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流
在上一篇博客中<iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流>,自定义瀑布流的列数,Cell的外边距,C ...
随机推荐
- 办理多伦多大学(本科)学历认证『微信171922772』Toronto学位证成绩单使馆认证University of Toronto
办理多伦多大学(本科)学历认证『微信171922772』Toronto学位证成绩单使馆认证University of Toronto Q.微信:171922772办理教育部国外学历学位认证海外大学毕业 ...
- hibernate-部分字段查询方案
hibernate的延迟加载与本列记录不一样,延迟加载正常一般用于关联字段,或者大型字段使用. 本列的情况主要用于,某一张表有几十甚至上百个字段,例如财务报表等.但是在使用某些场景是却大多只是用其10 ...
- [HMLY]13.请谨慎使用 @weakify 和 @strongify
前言 相信大部分见过 @weakify 和 @strongify 的开发者都会喜欢上这两个宏.但是很多人只知道它的强大威力,却没有意识到在特定环境下的危险性. 本文将通过代码测试的方式告诉读者,如何正 ...
- extjs底层源码实现继承分析
先说明一下在js中一般的继承是怎么写的 var farther=function(name){ this.name=name }; farther.prototype={ constructor:fa ...
- 前端——HTML笔记-One
一.HTML简介 html即超文本标记语言,指页面内可包含图片.链接,甚至音乐.程序等非文字元素,而标记语言:即标记(标签)构成的语言. 什么是标签: 标签中单词不可以数字开头. 标签不区分大小写.& ...
- 工具-maya2014软件操作细节(持续更新……)
整体 ------------------------------------------------------- [全选控制器] 1.选中总控-显示-隔离选择-查看选定对象 2.全选并创建新层(不 ...
- CODE[VS]-最小数和最大数-整数处理-天梯青铜
题目描述 Description 输入n个数,n<=100,找到其中最小的数和最大的数 输入描述 Input Description 第一行一个整数n 接下来一行n个整数,每个整数不超过231 ...
- 在tableview的headerView中添加webView,webView自适应高度
最近在项目中需要添加一个webView加载的页面,下面显示的是对这个webView所显示的内容的一个评论列表 ,列表要根据后台加载过来的HTML自适应的变化高度,tableview的cell在webV ...
- Objective-C Runtime 运行时之六:拾遗(转载)
前面几篇基本介绍了runtime中的大部分功能,包括对类与对象.成员变量与属性.方法与消息.分类与协议的处理.runtime大部分的功能都是围绕这几点来实现的. 本章的内容并不算重点,主要针对前文中对 ...
- 报错找不到org.apache,http...的解决办法
在build.gradle中加入 android { useLibrary 'org.apache.http.legacy' }