UICollectionView根据不同需求使用系统提供方法

2024-06-18 21:48

本文主要是介绍UICollectionView根据不同需求使用系统提供方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

经过对UICollectionView的进一步开发研究,灵活运用真的是其乐无穷啊,今天做了一个对比,一个简单的效果可以通过大量代码和“精简代码”两种代码量达到。

我们先看我想要实现的效果
这里写图片描述
我要在一个界面实现六个collectionview,每一个collectionview包括三列。然后每个collectionviewcell只有一个图片。(为了简单展示这里只用一个图片展示了)。

接下来就是collectionview自定义layout的时候了,这个也是我今天想要重点说的,首先说第一种方法,规规矩矩写的布局约束。代码如下:

#import "SingleCollectionLayout.h"@interface SingleCollectionLayout()
/** 存放所有cell的布局属性 */
@property (nonatomic, strong) NSMutableArray *attrsArray;
/** 存放所有列的当前高度 */
@property (nonatomic,assign) CGFloat lastHeight;@end
@implementation SingleCollectionLayout#pragma mark -懒加载
-(NSMutableArray *)attrsArray
{if (!_attrsArray) {_attrsArray = [NSMutableArray array];}return _attrsArray;
}#pragma mark -默认布局方法
/// 准备布局
- (void)prepareLayout {[super prepareLayout];//清除所有的布局属性[self.attrsArray removeAllObjects];//设置滚动方向self.scrollDirection = UICollectionViewScrollDirectionVertical;//设置竖直方向最小间距self.minimumLineSpacing = 1;//设置水平方向最小间距self.minimumInteritemSpacing = 1;NSInteger rowNum = [self.collectionView numberOfItemsInSection:0];for (NSInteger n = 0; n<rowNum; n++) {//创建对应的IndexpathNSIndexPath *indexPath = [NSIndexPath indexPathForRow:n inSection:0];// 获取indexPath位置cell对应的布局属性UICollectionViewLayoutAttributes *attrs = [self layoutAttributesForItemAtIndexPath:indexPath];[self.attrsArray addObject:attrs];}}
-(NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{return self.attrsArray;
}
-(UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{// 创建布局属性UICollectionViewLayoutAttributes *attrs = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];//声明cell的位置和大小CGFloat cellWidth,cellHeighth,cellX,cellY;//cell的宽高cellWidth = self.collectionView.frame.size.width / 3;cellHeighth = cellWidth;if (indexPath.row == 0) {//添加section的header部分到布局属性数组里面UICollectionViewLayoutAttributes *layoutAttributesHeader = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionHeader withIndexPath:indexPath];layoutAttributesHeader.frame = CGRectMake(0, 0, self.collectionView.frame.size.width, 40);[self.attrsArray addObject:layoutAttributesHeader];cellX = 0;cellY = 40;_lastHeight = 40;}else{NSInteger currentColumn = indexPath.row % 3;if (!currentColumn) {_lastHeight += cellWidth;}cellX = currentColumn * cellWidth;cellY = _lastHeight;}attrs.frame = CGRectMake(cellX, cellY, cellWidth, cellHeighth);return attrs;
}@end

根据上述代码我们可以看出来我的约束中只有一个header然后下面是每三个cell一行的布局,这样就是上述的规矩写法,下面我们看看简单的写法,简直刷新世界观。

#import "SingleCollectionLayout.h"@implementation SingleCollectionLayout
/// 准备布局
- (void)prepareLayout {[super prepareLayout];self.headerReferenceSize = CGSizeMake(self.collectionView.frame.size.width, 40);//设置item尺寸CGFloat itemWH = (self.collectionView.frame.size.width - 6) / 3;self.itemSize = CGSizeMake(itemWH, itemWH);//设置滚动方向self.scrollDirection = UICollectionViewScrollDirectionVertical;//设置最小间距self.minimumLineSpacing = 1;self.minimumInteritemSpacing = 1;}

没看错,就是这么一个方法,就是这么简单的几句话就可以完全实现上述的效果。

这篇关于UICollectionView根据不同需求使用系统提供方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073145

相关文章

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式