iOS 不规则瀑布流

2023-05-16

    iOS 自从出了UICollectionview之后,界面的样式可谓更加的多元化,对于一些较为复杂的界面UICollectionview都可以相对轻松的实现,而且由于其 FlowLayout 子类的存在,界面的布局更可谓是随心所欲,下面就来介绍下在处理图片中比较爱用到的瀑布流,我这里和一些其他人的方法不一样,我是重写了它的一个类来实现的瀑布流,那么废话不多说,直接上 Demo

  首先我们需要创建一个类,基于UICollectionViewLayout 然后重写系统的协议方法

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;

获取每个 item 的大小 ( 如果不重写的话 , 在当前的 .m 文件里得不到 size, 没有代理人去调用该方法得到 size)



  这里为.h的代码:

@protocol myCollectionFlowLayoutDelegate <NSObject>


//重写系统的协议方法 获取每个item的大小 (如果不重写的话,在当前的.m文件里得不到size,没有代理人去调用该方法得到size)

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;


@end



@interface myCollectionFlowlayout : UICollectionViewLayout


@property (nonatomic ,assign)id <myCollectionFlowLayoutDelegate>myCollectionFlowLayout;

@property (nonatomic ,retain)NSMutableArray *array;

@property (nonatomic ,assign)CGFloat maxHiget;

@property (nonatomic ,retain)UICollectionViewLayoutAttributes *attributes;


   下面为.m 里的代码:

//重写系统prepareLayout方法,准备布局item之前会调用

- (void)prepareLayout{

    

    [super prepareLayout];

    

    //重新设置滚动范围时用

    self.maxHiget = 0;

    //用来存放item的属性

    self.array = [NSMutableArray array];

    //设置每列item y坐标的初始值

    CGFloat LeftY = 60,MidY = 60,ReightY = 60;

    //计算contentView 第一步

    CGFloat maxLeft = 0,maxMid = 0 ,maxRight = 0;

   //获得当前section有多少个item(viewController的协议方法返回)

    NSInteger count = [self.collectionView numberOfItemsInSection:0];

    //设置每个item的属性

    for (int i = 0; i < count; i++) {

        //生成item下标

        NSIndexPath *index = [NSIndexPath indexPathForItem:i inSection:0];

        //获取协议返回的size

        CGSize itemSize = [self.myCollectionFlowLayout collectionView:self.collectionView layout:self sizeForItemAtIndexPath:index];

        //判断,先把不是第一列的item取出来

        if (i % 3 != 0) {

           //根据item下标取出每个item属性对象,通过它能设置itemframe

            self.attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:index];

           

            

            //设置默认的x坐标为0

            float offsetX = 0;

            if (i % 2 == 0) {

                //设置中间itemx130;

                offsetX = 130;

                //设置中间列itemframe

                self.attributes.frame = CGRectMake(offsetX, MidY, itemSize.width, itemSize.height);

                //记录中间所有item高度--->计算contentView 第二步

                maxMid = MidY + itemSize.height;

                //设置item中间的间距为5

                MidY += itemSize.height + 5;

                

                

            }else{

                //设置右边itemx255

                offsetX = 255;

                self.attributes.frame = CGRectMake(offsetX, ReightY, itemSize.width, itemSize.height);

                maxRight = ReightY + itemSize.height;

                //计算contentView 第三步

                ReightY += itemSize.height + 5;

                

            }

            //

            self.maxHiget = maxMid > maxRight ? maxMid +5 : maxRight + 5;

            //item属性存放到数组中

            [self.array addObject:self.attributes];

            

        }else{

//            //获取协议返回的size

//            CGSize itemSize = [self.myCollectionFlowLayout collectionView:self.collectionView layout:self sizeForItemAtIndexPath:index];

            //设置左边item属性

            self.attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:index];

            //直接把左边itemX设置为5

            float offsetX = 5;

            self.attributes.frame = CGRectMake(offsetX, LeftY, itemSize.width, itemSize.height);

            maxLeft = LeftY + itemSize.height;

            LeftY += itemSize.height + 5;

            self.maxHiget = self.maxHiget > LeftY ? self.maxHiget +5 : LeftY + 5;

            [self.array addObject:self.attributes];

            

        }

    }

    

}

//重写系统方法,初始的layout的外观将由该方法返回的UICollectionViewLayoutAttributes来决定


-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{

    

    NSMutableArray *Arr = [[NSMutableArray alloc]init];

    for (int i = 0; i < [self.array count]; i++) {

        UICollectionViewLayoutAttributes *att = [self.array objectAtIndex:i];

        //判断第二个rect是不是在第一个rect的范围之内


        if (CGRectIntersectsRect(rect, att.frame)) {

            [Arr addObject:att];

        }

    }

    return Arr;

    

}

//重新设置滚动范围ContentSize

- (CGSize)collectionViewContentSize

{

    NSLog(@"===%f",self.maxHiget);

    

    return CGSizeMake(self.collectionView.frame.size.width, self.maxHiget);

}


到这里,瀑布流里最为关键的我们已经完成了,接下来就是在 Colltroller 里来调用我们重写的类


创建一个 viewColltroller

.h 里的代码:


#import "myCollectionFlowlayout.h"

@interface ViewController : UIViewController<myCollectionFlowLayoutDelegate,UICollectionViewDataSource,UICollectionViewDelegate>

@property (nonatomic ,retain)NSMutableArray *allArr;

@property (nonatomic ,retain)UICollectionView *colletionView;

@end


.m 里的代码:

#import "ViewController.h"


@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    myCollectionFlowlayout *flowLayout = [[myCollectionFlowlayout alloc]init];

    flowLayout.myCollectionFlowLayout = self;

    

    self.allArr = [NSMutableArray array];

    

    self.colletionView = [[UICollectionView alloc]initWithFrame:[[UIScreen mainScreen]bounds] collectionViewLayout:flowLayout];

    self.colletionView.delegate = self;

    self.colletionView.dataSource = self;

    [self.view addSubview:self.colletionView];

    self.colletionView.backgroundColor = [UIColor blackColor];

    

    [self.colletionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"reuse"];

    


}


- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{

    NSLog(@"1111111111111");

    return 100;

    

}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

    

    static NSString *cellIdentifier = @"reuse";

    

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];

    cell.backgroundColor = [UIColor colorWithRed:1.000 green:0.677 blue:0.555 alpha:1.000];

    if (indexPath.row % 2 == 0 && indexPath.row % 3 != 0) {

        cell.backgroundColor = [UIColor colorWithRed:1.000 green:0.522 blue:0.625 alpha:1.000];

    }else if (indexPath.row % 3 == 0){

        

        cell.backgroundColor = [UIColor colorWithRed:0.944 green:1.000 blue:0.603 alpha:1.000];


    }

    return cell;

    

}


-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{

    

    return CGSizeMake(375/3 - 10, arc4random() % 201 + 160);

    

    

}


这样,我们就实现了两列不规则瀑布流了....






本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 不规则瀑布流 的相关文章

随机推荐

  • ubuntu设置代理 的三种方式

    转载自 xff1a http www cnblogs com lexus archive 2012 02 20 2359229 html ubuntu下设置代理 2010 01 11 20 13 20 分类 xff1a ubuntu总结 标
  • win10 + WDK10+ VS2015 + vmware_win10 驱动开发环境配置

    自从WDK8 1后 xff0c 开发window 驱动不用再用windbg 43 虚拟机调试了 xff0c 我们调试驱动也可以像调试EXE 一样方便 xff0c 下面是win10 主机 43 WDK10 43 VS2015 43 vmwar
  • VS Code搭建PyQt5开发环境

    前言 二 PyQt5相关模块下载 1 利用Python的pip安装PyQt5和PyQt5 tools扩展包 2 VS code中安装PyQt Integration和Qt for Python 3 VS code中配置Qt designer
  • 解密微信电脑版image文件夹下缓存的用户图片

    我们的微信体积越来越大 xff0c 该怎样查看 xff1f 该怎样为其减肥哪 xff1f 重点来了 在微信缓存中 FileStorage 文件夹时发现了其目录下的 Image 文件夹 xff0c 可能是使用过程中缓存的聊天图片等 xff0c
  • 怎么寻找微信撤回的图片

    1 回顾 自从发布文章 寻找微信撤回的图片 之后 xff0c 骗了不少粉啊 总之 xff0c 之前提出了一种可以找到微信撤回图片的方法 2 真相 之前的说法是 xff0c 工程师并没有真正把撤回的图片删除 xff0c 而是加密后藏起来了 其
  • 电脑端微信文件的存储位置在哪?

    在微信聊天中会产生很多文件 xff0c 首先微信的文件存放位置 xff1a 默认情况下 c users administrator document wechat files xxx 以下所有文件截图都是从这个父级目录开始的 示例图 Bac
  • 微信的dat文件正确打开方式及问题处理

    微信的dat文件是微信用于缓存PC端微信的图片 xff0c 然后对图片进行了加密的处理 所以是可以删除的 xff0c 有些朋友data文件夹下有十几G的 xff0c 都是可以删除的 xff0c 但是最好确保这些文件都已经没有用处了再进行删除
  • 微信中的dat文件到底是什么

    微信dat文件是表示电脑上微信聊天记录数据文件 xff0c 可以选择删除 虽然删除这些文件并不会影响微信的正常使用 xff0c 但是如果需保留电脑端微信的聊天记录 xff0c 重要的材料则不要删除 微信 xff08 WeChat xff09
  • 2022年2月11日

    P3375 模板 KMP字符串匹配 题目描述 给出两个字符串 s 1s1 和 s 2s2 xff0c 若 s 1s1 的区间 l r l r 子串与 s 2s2 完全相同 xff0c 则称 s 2s2 在 s 1s1 中出现了 xff0c
  • 网易云音乐NCM格式转化为mp3

    前段时间帮朋友下歌放在车上听 结果好多都是ncm格式 xff0c 伤心 xff0c 搜索了下发现基本上这格式解密有好多昂 xff0c 可惜UI我都不太想要 决定抄一下 xff0c 自己做一个 这里先记录下核心代码 xff0c 回头补充个UI
  • 旧电脑怎么升级到新版Win10

    Windows 10 2020年5月更新是最新版的win10系统 xff0c 相比以往的win10有了许多的改进 xff0c 比如说新的Cortana应用 云端重置以及Linux 2的Windows子系统等等 而Windows搜索的改进 x
  • K12教育小初高各个版本教材内的章节数据

    一个 相对 权威的资源网站 xff0c 然后把这个网站上的所有章节 教材全部爬下来 xff0c 进行保存数据库 xff0c 用于我们后续教学方面的基础数据 先说下结果 xff1a 算上小学 初中 高中三个学段 xff0c 所有学科下共计51
  • 1-FreeSwitch-CentOS7安装freeswitch1.10.2

    文章目录 一 前言二 安装2 1 安装 96 96 96 noarch 96 96 96 2 2 96 96 96 处理安装源 96 96 96 2 3 安装 96 96 96 cmake 96 96 96 2 4 安装 96 96 96
  • 「Python语法结构」输出语句示例(1)

    打印 玩具列表 字符串 功能要求 在屏幕上打印出 玩具列表 这样 实例代码 print 39 玩具列表 39 print 34 玩具列表 34 print 39 39 39 玩具列表 39 39 39 print 34 34 34 玩具列表
  • wsl导致vmmem占用高解决办法

    自从装了wsl我这个年迈的电脑就更加吃力 xff0c 尤其是内存基本上都要占到90 以上 xff0c 打开任务管理器一看内存一半以上都是被vmmem吃掉了 xff0c 于是在网上寻找解决办法 xff0c 并记录优化过程 文章目录 定期执行缓
  • wsl配置java环境以及使用vscode调试

    记录如何在wsl中配置java编译环境 xff0c 以及如何使用vscode进行编译调试 文章目录 下载jdk下载maven配置环境变量使用vscode调试java 下载jdk 点击进入到oracle jdk的下载页面 选择合适的安装包 解
  • python pip 打包指南

    一个成功的开源项目的其核心功能是打包功能 xff0c 而出色的打包功能的关键在于版本控制 因为项目是开源的 xff0c 所以您希望发布的包能够体现出开源社区所具备的优点 不同的平台与语言具有不同的打包机制 xff0c 本文主要讲述的是 Py
  • 虚拟机安装WIN系统后无法启动

    在虚拟机里安装完WINDOWS操作系统后 xff0c 无法启动 xff08 当然是GHOST版本 xff09 xff0c 启动时提示 xff1a Network boot from AMD Am79C970A Copright c 2003
  • VMware Esxi 8.0 直通Nvidia P40显卡

    目录 一 前言 二 错误信息 三 解决过程 一 前言 接到一个客户需求 xff0c 想在Esxi上直通Nvidia P40显卡 xff0c 直通后无法打开虚拟机 二 错误信息 下图是错误信息 xff0c 如图所示 xff0c 任务名称 打开
  • iOS 不规则瀑布流

    iOS 自从出了UICollectionview之后 界面的样式可谓更加的多元化 对于一些较为复杂的界面UICollectionview都可以相对轻松的实现 而且由于其 FlowLayout 子类的存在 界面的布局更可谓是随心所欲 下面就来