首页 > 其他分享 >iOS 瀑布流之栅格布局

iOS 瀑布流之栅格布局

时间:2023-06-02 13:32:26浏览次数:40  
标签:流之 iOS edgeInsets 栅格 瀑布 destRow rowWidths self CGFloat

一 、效果预览

二、确定需求

由下面的需求示意图可知模块的最小单位是正方形,边长是屏幕宽除去边距间隔后的四等份,而每个模块的样式有小正方形(1:1)、大正方形(2:2)、横长方形(2:1)、纵长方形(1:2),动态的根据服务器下发模块样式绘制布局,可以横向滑动,限定为两行的高度。
注意:上面的示意宽高比是约等于,忽略了间距,计算的时候千万别忘了。

三、实现思路

由上需求分析可知,我们可以让后台每个模块下发width和height两个字段,字段的值是1或2就行了,然后我们就能根据宽高字段来确定模块的宽高了。现在宽高有了,我们怎么来绘制模块呢?
答案当然是用UICollectionView了,然后自定义流水布局UICollectionViewLayout,主要代码如下:计算记录每一个cell对应的布局属性。瀑布流的创建我已在之前的 iOS 瀑布流封装 文章中写过了,这次只是多了个栅格布局的瀑布流样式,可以下载当前最新示例Demo查看。

/** 返回indexPath位置cell对应的布局属性*/
- (CGRect)itemFrameOfHorizontalGridWaterFlow:(NSIndexPath *)indexPath{
    //collectionView的高度
    CGFloat collectionH = self.collectionView.frame.size.height;
    //设置布局属性item的frame
    CGFloat h = [self.delegate waterFlowLayout:self sizeForItemAtIndexPath:indexPath].height;
    CGFloat w = [self.delegate waterFlowLayout:self sizeForItemAtIndexPath:indexPath].width;
    
    CGFloat x = 0;
    CGFloat y = 0;
  
    //找出宽度最短的那一行
    NSInteger destRow = 0;
    CGFloat minRowWidth = [self.rowWidths[destRow] doubleValue];
    for (NSInteger i = 1; i < self.rowWidths.count; i++) {
        //取出第i行
        CGFloat rowWidth = [self.rowWidths[i] doubleValue];
        if (minRowWidth > rowWidth) {
            minRowWidth = rowWidth;
            destRow = i;
        }
    }
    
    y = destRow == 0 ? self.edgeInsets.top : self.edgeInsets.top + h + self.rowMargin;
    
    x = [self.rowWidths[destRow] doubleValue] == self.edgeInsets.left ? self.edgeInsets.left : [self.rowWidths[destRow] doubleValue] + self.columnMargin;
    //更新最短那行的宽度
    if (h >= collectionH - self.edgeInsets.bottom - self.edgeInsets.top) {
        x = [self.rowWidths[destRow] doubleValue] == self.edgeInsets.left ? self.edgeInsets.left : self.maxRowWidth + self.columnMargin;
        for (NSInteger i = 0; i < 2; i++) {
            self.rowWidths[i] = @(x + w);
        }
    }else{
        self.rowWidths[destRow] = @(x + w);
    }
    //记录最大宽度
    if (self.maxRowWidth < x + w) {
        self.maxRowWidth = x + w ;
    }
    return CGRectMake(x, y, w, h);
}

功能描述:WSLWaterFlowLayout 是在继承于UICollectionViewLayout的基础上封装的带头脚视图的瀑布流控件。目前支持竖向瀑布流(item等宽不等高、支持头脚视图)、水平瀑布流(item等高不等宽 不支持头脚视图)、竖向瀑布流( item等高不等宽、支持头脚视图)、栅格布局瀑布流 4种样式的瀑布流布局。

四、项目结构

iOS 瀑布流之栅格布局_瀑布流

iOS 瀑布流之栅格布局



标签:流之,iOS,edgeInsets,栅格,瀑布,destRow,rowWidths,self,CGFloat
From: https://blog.51cto.com/u_7583030/6401891

相关文章

  • iOS TableView多级列表
    效果预览一、需求TableView多级列表:分级展开或合并,逐级获取并展示其子级数据,可以设置最大的层级数,支持多选、单选、取消选择。二、思路由需求和示意图可知,这些数据元素之间存在着一对多关系,很符合数据结构与算法–树形结构的特征。那么,我们就用树形结构中的结点(Node)来作为存......
  • iOS企业签名掉签,iOS企业签名掉签了怎么办?103.107.190.x
    不能上架到AppStore的iOS应用,几乎每一个开发者的选择都是通过iOS签名这种内测渠道来完成APP的上架任务,最常用的就是企业签名、超级签名以及TF上架,其中最受欢迎的当属于企业签名了。不过企业签名会出现掉签的现象,那么企业签名掉签了该如何处理呢?今天我就来分享下关于签名掉签的原......
  • mock拦截axios请求,以及axios请求拦截设置token
     直接上源码:<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>mock拦截axios请求</title></head><body><!--本地npm安装mock和axios--><!--<scriptsrc="../node_modu......
  • ShareSDK iOS端合规指南
    2021年5月1日起,由国家互联网信息办公室、工业和信息化部、公安部、国家市场监督管理总局联合制定了《常见类型移动互联网应用程序必要个人信息范围规定》(简称“App必要个人信息范围规定”)已正式施行。“App必要个人信息范围规定”不仅明确常见39种类型的App必要个人信息范围,而且明......
  • BFT最前线 | iOS版ChatGPT周下载突破50万人次;英伟达市值突破万亿美元创造芯片公司历史
    原创|文BFT机器人AI视界TECHNOLOGYNEWS01联合国教育部聚焦生成式AI联合国科教文组织提出发展路线图近日,为应对生成式人工智能技术的迅速发展,联合国教科文组织就此议题召开了首次全球教育部长会议。40多位部长分享了将这些工具融入教育的政策方法和规划,并交换了意见。会议期间,教......
  • iOS-高仿通讯录之商品索引排序搜索
    概述TableView添加右侧索引,将数据按照索引分组排序,并添加搜索功能且在搜索界面复用当前页面.详细项目中像一些商品搜索类界面,TableView添加右侧索引的使用越来越多,的确用户体验提高了许多.一、主要思路大致思路:1.添加并设置右侧索引2.自定义汉字转化成拼......
  • iOS仿支付宝芝麻信用仪表盘效果
    概述自定义View之高仿支付宝芝麻信用分数仪表盘动画效果详细仿支付宝芝麻信用仪表盘效果一、主要思路1.圆环上绿点的旋转2.分数值及提示语的变化3.背景色的变化二、程序实现一.自定义ZLDashboardView仪表盘文件:根据跃动数字,确定百分比,现在的跳动数字---->......
  • iOS蓝牙BLE4.0通信功能
    概述iOS蓝牙BLE4.0通信功能,最近刚学的苹果,为了实现蓝牙门锁的项目,找了一天学习了下蓝牙的原理,亲手测试了一次蓝牙的通信功能,结果成功了,那么就把我学习的东西分享一下。详细一、蓝牙常见名称和缩写BLE:(Bluetoothlowenergy)蓝牙4.0设备因为低耗电BLE:(Bluetoothlow......
  • iOS- 快速实现展示布局
    概述比较有规律的页面,快速实现展示布局,提高开发效率.详细看到这个界面,是不是觉得不像那种比较有规律的,可以用单独tableViewCell或者xib来实现方便些的,现在我直接在C里快速实现展示布局.一、程序实现先看布局,可以分成两个分区:在数据源方法里去处理......
  • iOS中容易用错的常用知识点
    坐标系转换ios中的坐标系有三种视图坐标系:原点(0,0)视图的左上角窗口坐标系:原点(0,0)窗口的左上角世界坐标系:原点(0,0)游戏中世界的原点平时开发中经常会遇到转UIWindow坐标问题,如:已知一个UI控件的坐标,把它转换到UIWindow时,它对应的UIWindow坐标是什么?苹果提供了一套相关的......