iOS关于列表布局的几种实现方式小结

news2025/1/11 14:29:15

,功能的要求是最多六行,动态展示。当时想到的方案是,抽象出一个cell,初始化六个标签,动态的控制显示和隐藏,这样功能上没有问题,就是代码有些冗余。请教了身边的美女同事,她那边的思路是用UICollectionView来布局实现。经过优化后的代码如下。

  

- (void)setupUI{

    

    UICollectionViewFlowLayout * layout = [[UICollectionViewFlowLayout alloc]init];

    layout.itemSize = CGSizeMake(K_CC_SCREEN_WIDTH, 20+10);

  //行间距

    layout.minimumLineSpacing = 0;

  //列间距

    layout.minimumInteritemSpacing = 0;

    layout.scrollDirection = UICollectionViewScrollDirectionVertical;

    

    self.collectionView = [[UICollectionView alloc]initWithFrame:CGRectZero collectionViewLayout:layout];

    [self.contentView addSubview:self.collectionView];

    self.collectionView.delegate = self;

    self.collectionView.dataSource = self;

    self.collectionView.layer.masksToBounds = YES;

    self.collectionView.layer.cornerRadius = 8.0;

    self.collectionView.showsVerticalScrollIndicator = NO;

    self.collectionView.showsHorizontalScrollIndicator = NO;

    self.collectionView.backgroundColor = [UIColor clearColor];

    [self.collectionView registerClass:[CCHighSeasPoolCenterCollectionViewCell class] forCellWithReuseIdentifier:ccHighSeasPoolCenterCollectionViewCellIdentifier];

}

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

    return self.dataSeasLeftList.count;

}

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

    

    CCHighSeasPoolCenterCollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:ccHighSeasPoolCenterCollectionViewCellIdentifier forIndexPath:indexPath];

    

    CCHighSeasPoolFieldListModel *leftDic=[self.dataSeasLeftList objectAtIndex:indexPath.item];

    //此处第一行展示一个值,其余列表需要拼接字段

    NSString *firstText=[NSString stringWithFormat:@"%@:%@",[self getNewValue:leftDic.nameLabel],[self getNewValue:[self.itemDic objectForKey:[self getNewKey:leftDic]]]];

    if (indexPath.item==0) {

        //此处需要单独设置第一行的样式

        [cell.lblType setText:[self getNewValue:[self.itemDic objectForKey:[self getNewKey:leftDic]]]];

        cell.lblType.textColor = K_CC_COLOR_STRING(@"#333333");

        cell.lblType.font = [UIFont boldSystemFontOfSize:16];

    }else{

        [cell.lblType setText:firstText];

        cell.lblType.textColor = K_CC_COLOR_STRING(@"#999999");

        cell.lblType.font = [UIFont systemFontOfSize:14];

    }

    

    return cell;

}

- (void)setDic:(NSMutableDictionary *)dic{

    //此处获取当前字典的值,在cell列表中使用

    self.itemDic=dic;

    

    [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) {

        make.left.mas_equalTo(0);

        make.top.mas_equalTo(self.contentView.mas_top);

        make.width.mas_equalTo(K_CC_SCREEN_WIDTH);

        make.bottom.mas_equalTo(self.contentView.mas_bottom);

    }];

    

    [self.imageSelect mas_makeConstraints:^(MASConstraintMaker *make) {

        make.left.mas_equalTo(16);

        make.top.mas_equalTo(14);

        make.size.mas_equalTo(CGSizeMake(21, 21));

    }];

    

    [self.btnSelect mas_makeConstraints:^(MASConstraintMaker *make) {

        make.width.mas_equalTo(80);

        make.height.mas_equalTo(80);

        make.top.mas_equalTo(0);

        make.left.mas_equalTo(0);}];

    

    [self.btnJump mas_makeConstraints:^(MASConstraintMaker *make) {

        make.width.mas_equalTo(K_CC_SCREEN_WIDTH-80);

        make.bottom.mas_equalTo(self.contentView.mas_bottom);

        make.top.mas_equalTo(0);

        make.left.mas_equalTo(45);}];

    

    [self.viewLine mas_makeConstraints:^(MASConstraintMaker *make) {

        make.left.mas_equalTo(0);

        make.bottom.mas_equalTo(self.contentView.mas_bottom).mas_offset(-1);

        make.size.mas_equalTo(CGSizeMake(K_CC_SCREEN_WIDTH, 1));

    }];

    

    [self.collectionView reloadData];

}

//获取新的key

-(NSString *)getNewKey:(CCHighSeasPoolFieldListModel*)temDic

{

    NSString *tempKey=temDic.schemefieldName;

    

    NSString *schemefieldType=temDic.schemefieldType;

    //IMG

    if ([schemefieldType isEqualToString:@"Y"]||[schemefieldType isEqualToString:@"M"]||[schemefieldType isEqualToString:@"R"]||[schemefieldType isEqualToString:@"MR"]||[schemefieldType isEqualToString:@"FL"]||[schemefieldType isEqualToString:@"FL"]) {

        //如果是这几种情况,需要拼接ccname

        tempKey=[NSString stringWithFormat:@"%@ccname", tempKey];

    }

    return tempKey;

}

//获取新的value

-(NSString *)getNewValue:(NSString*)temValue

{

    if ([CCCommonAPI xfunc_check_strEmpty:temValue] ) {

        temValue=@"";

    }

    return temValue;

}

  有时候一个思路就是一种方案。代码确实优化了不少,长知识啊。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.17 发送多部件邮件

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇5 整合第三方技术5.17 发送多部件邮件5.17.1 发送多部件邮件5.17.2 添…

Python脚本之并发执行加密方法【一】

本文为博主原创,未经授权,严禁转载及使用。 本文链接:https://blog.csdn.net/zyooooxie/article/details/125650427 之前写过一篇 JMeter性能测试之参数加密【一】,现在把后面的补上。实际第一篇就写完了 JMeter压测遇到加密接口…

Java Class11

Java Class11 集合 概念 集合是用于存储对象的工具类容器,实现了常用的数据结构,提供了一系列公开的方法用于删除、修改、查找和遍历数据,降低了日常开发成本。 三种集合 Set set集合中元素是无序、不可重复的 List list集合中元素是从前到…

公众号免费搜题功能搭建

公众号免费搜题功能搭建 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 题库:题库后台(点击跳转&#xf…

基于C语言实现进度条 | 附源码

进度条的应用在软件中无处不在,拷贝一个文件需要一个进度条,加载一个文件也需要一个进度条,来标志完成与否。 那么 ,一个进度条有哪些元素呢: 一个不断向右生长的容器(直观的看出当前的进度) …

Spring的循环依赖问题

Spring中循环依赖场景有: 构造器的循环依赖(构造器注⼊) Field 属性的循环依赖(set注⼊) 各场景下循环依赖解决的情况 单例 bean 构造器参数循环依赖(⽆法解决) 构造器在Bean的生命周期中实例…

GitHub最新发布,阿里十年架构师手写版spring全家桶笔记全新开源

嗨咯,大家好! 没错,又是我,还跟前面一样,有好东西我才会出现。那是什么好东西呢?今天啊,给他分享阿里在Github最新发布的spring全家桶笔记第九版,这份笔记一共分三份:sp…

G1垃圾回收器

概述 官网 https://docs.oracle.com/en/java/javase/16/gctuning/garbage-first-g1-garbage-collector1.html#GUID-ED3AB6D3-FD9B-4447-9EDF-983ED2F7A573 简介 G1垃圾回收器可以同时回收新生代和老年代的对象,不需要两个垃圾回收器配合起来运作,他一…

高项 进度管理论文

七个过程: 项目进度管理包括为管理项目按时完成所需的7个过程,具体为: (1)规划进度管理:为规划、编制、管理、执行和控制项目进度而制定政策、程序和文档过程。 (2)定义活动&…

【C语言】初阶指针的简单使用 _指针运算 指针和数组的关系[初阶篇 _学习专用]

1.指针是什么? 在学习指针的时候,我们经常会看到下面这段代码: int main() {int a 10;int* pa &a;*pa 20; } 之前并没有接触过指针的朋友们看到后可能是一头雾水,根本不知道从哪里去理解;下面我们就通过一些…

STM32开发时HardFault错误的排查

STM32开发时HardFault错误的排查 本篇是 嵌入式开发-STM32硬件I2C驱动OLED屏 一文的扩展。 把相关的问题记录一下,给遇到HardFault_Handler问题的朋友做个参考。 故障现象 做STM32开发,经常遇到HardFault错误,也就是程序不会正常运行&…

WPF动画(2)

动画的生命周期 从技术的角度看,WPF动画只是暂时的,这意味着它们不能真正改变基本属性的 值,当动画处于活动状态时,只是覆盖了属性的值 。 单向动画,在动画运行结束后会保持处于活动状态,这是因为动画需要…

(十一)手写简单的Spring框架

文章目录第一步:搭建环境第二步:准备好要管理的Bean第三步:准备myspring.xml配置文件第四步:编写MyApplicationContext接口第五步:编写MyClassPathXmlApplicationContext第六步:采用Map集合存储Bean第七步&…

第十一章 Golang面向对象编程(下)

面向对象编程三大特性 基本介绍 Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其他OOP语言不一样。 封装 面向对象编程思想-抽象 我们在前面去定义一个结构体的时候,实际上就是把一类事物共有的属性(字段…

Presto 之 explain and explain analyze的实现

一. 前言 本文主要探索在Presto中Explain功能是如何实现的。在Presto中,Explain用法有两种,一种是单纯的explain,此场景只会显示经过RBO优化后的执行计划,但是查询并不会真正地执行。第二种是explain analyze,此场景会…

JVM常用参数

JVM内存相关的几个核心参数 -Xms:Java堆内存初始大小-Xmx:Java堆内存的最大大小-Xmn:Java堆内存中的新生代大小,扣除新生代剩下的就是老年代的内存大小了-XX:PermSize:永久代大小-XX:MaxPermSize:永久代最…

疾控物资管理系统-疾控中心物资管理系统

一、系统概述 东识科技(DONWIT)疾控中心物资管理系统(智物资DW-S300)是依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 随着疫情的突…

(STM32)从零开始的RT-Thread之旅--GPIO

上一篇: (STM32)从零开始的RT-Thread之旅--基础项目构建与时钟配置 无论什么开发板,最先调试的肯定是GPIO,一般用来用作指示灯或者按键输入。本篇只是很简单的GPIO应用,没有具体分析RTT框架实现。 首先先创建一个BSP文件夹&…

机器人操作系统ROS(21) jetson nano安装torch tensorflow

安装torch、tensorflow其实跟普通在Linux系统安装没有区别,但是Linux是arch64位的,而jetson是aarch64位的,所以还是不太一样。 另外一个坑是:购买的创乐博的机器人,已经安装ros,但是安装torh的时候需要apt …

使用Spring实现工厂+策略模式

使用Spring实现工厂策略模式 这里使用发短信业务&#xff1a; 不同短信有不同模板但是发送方法都相同只是发送内同不同 1. 定义短信发送策略接口&#xff1a; //策略接口 public interface SmsTemStrategy {public void sendSms(Map<String,String> params); }2.短信…