//自定义布局,继承于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开发瀑布流的实现的更多相关文章

  1. ios开发瀑布流框架的应用

    一:瀑布流框架的应用:将封装好的瀑布流框架导入,遵守协议 二:代码: #import "HMShopsViewController.h" #import "HMShopC ...

  2. ios开发瀑布流框架的封装

    一:瀑布流框架封装的实现思路:此瀑布流框架的封装仿照tableView的底层实现,1:每个cell的frame的设置都是找出每列的最大y值,比较每列的最大y值,将下一个cell放在最大y值最小的那一列 ...

  3. iOS基础 - 瀑布流

    一.瀑布流简介 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早采用此布局的网站是Pint ...

  4. iOS横向瀑布流的封装

    前段时间, 做一个羡慕, 需要使用到瀑布流! 说道瀑布流, 或许大家都不陌生, 瀑布流的实现也有很多种! 从scrollView 到 tableView 书写的瀑布流, 然后再到2012年iOS6 苹 ...

  5. ios图片瀑布流代码

    ios瀑布流,实现简单的瀑布流视图布局,可以显示网络图片,下拉刷新,上拉加载更多. 下载:http://www.huiyi8.com/sc/9087.html

  6. iOS - UICollectionView 瀑布流 添加表头视图的坑

    UICollectionView 瀑布流 添加表头视图的坑 首先是,需求加了个头视图在顶部,在collectionView中的头视图跟TableView的不一样,TableView的表头只要设置tab ...

  7. 堆糖瀑布流完整解决方案(jQuery)

    2010年堆糖创办以来,网站界面经历过3-5次重大改版,logo也曾更换过两次,早期蓝红相间三个圈的logo恐怕很少有人记得了.与此同时,前端 js 框架也在默默的更新换代.最早堆糖上线时,js 采用 ...

  8. jQuery动态网格瀑布流插件Masonry

    Masonry是一款非常强大的jQuery动态网格布局插件,可以帮助开发人员快速开发瀑布流界面效果.和CSS中float的效果不太一样的地方在于,float先水平排列,然后再垂直排列,使用Masonr ...

  9. iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流

    在上一篇博客中<iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流>,自定义瀑布流的列数,Cell的外边距,C ...

随机推荐

  1. Kattis - Aaah!

    Aaah! Photo by Unknown Jon Marius shouted too much at the recent Justin Bieber concert, and now need ...

  2. SwiftyUserDefaults-封装系统本地化的框架

    // // ViewController.swift // Test4SwiftyUserDefaults // // Created by 马玉龙 on 2017/1/14. // Copyrigh ...

  3. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

  4. 如何安装chrome扩展?比如json-handle插件如何安装

    chrome插件安装方法: 方式一,在线安装 直接插到json-handle地址,添加即可 https://chrome.google.com/webstore/detail/json-handle/ ...

  5. IIS错误解决办法(HTTP Error 500.19 - Internal Server Error)

    window10 切换登陆用户,VS2015的IIS Express 调试代码报HTTP Error 500.19 - Internal Server Error 错误,无法读取配置文件解决办法. I ...

  6. CSU 1812 三角形和矩形

    湖南省第十二届大学生计算机程序设计竞赛$J$题 计算几何. #pragma comment(linker, "/STACK:1024000000,1024000000") #inc ...

  7. 了解OutOfMemoryError异常 - 深入Java虚拟机读后总结

    JVM中的异常发生 Java虚拟机规范中除了程序计数器外,其他几个运行时区域都有发生OutOfMemoryError异常的可能. 本章笔记通过代码来验证Java虚拟机规范中描述的各个运行时区域存储的内 ...

  8. .net 在数据访问层中写一个DBhelper优化类

    复习了在学校的时候做的WinForm端的一个学生信息管理系统,用的三层架构,看了一下里面的数据优化类 这个类是用来把对数据库的操作封装成静态方法,增删改查的时候直接调用这个类,减少项目里代码的冗余和方 ...

  9. Android如何查看应用签名信息

    转自http://www.trinea.cn/android/android-view-signatures/comment-page-1/ 介绍Android如何查看自己的应用签名及三方APK或系统 ...

  10. 【Python】回文

    首先判断一个字符串是否回文: def isPlalind(s): if len(s) == 1: return True else: return s[0] == s[-1] and isPlalin ...