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 不规则瀑布流 的相关文章

  • 以编程方式检测应用程序是否正在设备或模拟器上运行

    我想知道我的应用程序在运行时是在设备还是模拟器上运行 有没有办法检测到这一点 原因是用模拟器测试蓝牙 api http volcore limbicsoft com 2009 09 iphone os 31 gamekit pt 1 woo
  • 如何将数据从一个视图传递到下一个视图?

    我正在制作一个下载排队系统来下载视频 处理下载的排队代码位于另一个视图控制器中 现在我的问题是如何将下载的 URL 传递到另一个视图而不推送到另一个视图控制器 如下所示 ViewConntroller View ViewConntrolle
  • 如何在 swift 中以编程方式使用坐标打开地图应用程序?

    我想在地图应用程序中打开纬度和经度 我尝试了这段代码HERE https stackoverflow com questions 12504294 programmatically open maps app in ios 6 func g
  • 尝试注册 RCTBridgeModule 类 RCTFileReaderModule

    尝试为名称 FileReaderModule 注册 RCTBridgeModule 类 RCTFileReaderModule 但该名称已由类 FileReaderModule 注册 尝试使用命令react native run ios在i
  • Swift - 将图像插入 PDF 不再适用于 iOS 13

    目前正在开发在我的贷款计算器应用程序上导出 PDF 的功能 我有一个预览屏幕 可以在您保存 PDF 之前显示它 预览屏幕由带有 html 的 webView 组成 其中包含占位符 我能够成功地将图像插入到正确的占位符上 并将其显示在 PDF
  • iOS 键盘显示后分屏宽度

    我刚刚开始研究 Cordova 应用程序对分屏多任务处理的支持 到目前为止 该应用程序在模拟器中的 iPad 上显示和调整大小都很好 但是当我单击编辑字段并显示软件键盘时 100 宽度的值开始返回整个屏幕 而不是给出的窗口 初始显示 到目前
  • 如何在运行仅 iPhone 应用程序(非通用)的 iPad 上的 UIPickerView 中支持 VoiceOver?

    一般来说 我会查看 Apple 的 UICatalog 示例代码以获取基本的 VoiceOver 支持 但示例代码中似乎有对 UIPickerViews 的 VoiceOver 支持 我是否需要在某处提供accessibilityLabel
  • 防止点击 MKAnnotation 时检测到 MKMapView 上的触摸事件

    我有一个 UITapGestureRecognizer 当用户点击地图时 它将在我的 MKMap 上隐藏和显示工具栏 简单 但是 当用户点击 MKMapAnnotation 时 我不希望地图以正常方式响应点击 如上所述 此外 当用户点击地图
  • 如何无限地每1分钟运行一个iOS应用程序?

    我制作了一个应用程序 需要每 1 分钟向服务器发送一次位置和状态更新 我尝试了以下方法 但没有一个能帮助我 有什么解决办法吗 1 NSTimer 很多人建议这样做 但问题出在后台模式上 它只能工作 20 分钟 该应用程序停止发送数据后 2
  • 如何在 SQLite 中替换字符串?

    如何更新具有以下内容的表列 var mobile 233KKFSDK3234 Documents Page jpg 并将其替换为 Documents Page jpg 在 SQLite 中 注意 所有文字 除了 Documents 是动态的
  • 以编程方式向 UIButton 标签添加阴影

    我试图向按钮标签添加 1px 黑色阴影 但没有成功 我试过这个 self setTitleShadowOffset CGSizeMake 0 1 但我得到 请求非结构或联合中的成员 setTitleShadowOffset 任何建议都会很棒
  • 有没有办法阻止 iOS 上的 Safari 在关闭时清除网站的 cookie?

    我的移动网络应用程序的一位用户抱怨说 每次他关闭手机屏幕后使用该应用程序时 他都必须重新登录该应用程序 发生的情况是 当屏幕关闭时 或者当您通过双击主页按钮并滑开 Safari 来完全关闭 Safari 时 Safari 会清除该网站的 C
  • 如何从 iOS 应用程序检测不安全的 wifi 网络

    我想检测我的应用程序中是否存在不安全的 wifi 网络 是否有任何公共 iOS API 可以实现相同的目的 没有记录的 API 可以获取该信息 如果您的应用程序需要通过网络发送和接收敏感数据 您通常应该假设没有安全连接
  • AppDelegate 的变量用作全局变量不起作用

    我想使用我的 AppDelegate 来存储任何其他类都可以访问的对象 我已经像这样声明了这个 AppDelegate interface MyAppDelegate UIResponder
  • 你如何在react-native中实现捏合缩放?

    我一直在研究 PanResponder 我当前的工作假设是 我将检测是否有两个触摸正在向外移动 如果是 则增加元素大小onPanResponderMove功能 这似乎是一种混乱的方法 有没有更顺畅的方法呢 如果您只需要简单的捏缩放功能 只需
  • UICollectionReusableView 方法未被调用

    我希望我的部分位于UICollectionView有一个带有图像的标题 我已按照以下步骤操作 在故事板中 分配了一个标题作为我的附件UICollectionView 给它一个标识符 创建了一个子类UICollectionReusableVi
  • 将语音添加到自定义 UIMenuController

    我创建了一个自定义UIMenuController in a UIWebView但它似乎摆脱了 说出选择 选项UIMenuController在那之后 所有测试设备上的 偏好设置 中都打开了发言选择选项 并且它出现在其他应用程序中 包括非
  • 如何获取 UITableView 中的所有单元格

    假设我有一个包含多行的 UITableView 我想在某个时间点将所有 UITableViewCells 作为 NSArray 获取 我努力了 tableView visibleCells 但这种方法有一个问题 我无法拥有当前不在当前屏幕中
  • 如何在 Swift 中创建 UIAlertView?

    我一直在努力在 Swift 中创建 UIAlertView 但由于某种原因我无法得到正确的语句 因为我收到此错误 找不到接受提供的 init 重载 论点 我是这样写的 let button2Alert UIAlertView UIAlert
  • 由于 2.23 导致 iOS 应用程序被拒绝 - iOS 数据存储指南

    以下是 Apple 关于拒绝的消息 2 23 应用程序必须遵循 iOS 数据存储指南 否则将被拒绝 2 23 详情 在启动和内容下载时 您的应用程序会存储 6 5 MB 这并不意味着 遵守 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 子类的存在 界面的布局更可谓是随心所欲 下面就来