【iOS】UICollectionView的使用方法

news2024/10/21 22:54:48

文章目录

  • 前言
  • UICollectionView
      • 什么是UICollectionView
      • UICollectionView的关键特性
      • UICollectionView组成及常用方法
        • 组成
        • 常用方法
      • UiCollectionView的基本使用及代码示例
  • 总结

前言

  UICollectionView 是一个强大的 UIKit 组件,用于展示数据集合,比如图片、文字列表等。它支持复杂的布局,包括网格、瀑布流等。以下是我个人在学习UICollectionView时的笔记。

UICollectionView

什么是UICollectionView

  UICollectionView 是一个高度可定制的视图,可以展示一个或多个子视图(UICollectionViewCell),这些子视图可以被组织成不同的布局。它常用于展示图片、列表、网格等,并且支持用户交互,如滚动、选择和拖拽。

UICollectionView的关键特性

布局灵活性:UICollectionView 的布局由 UICollectionViewLayout 及其子类负责。我们可以通过使用不同的 UICollectionViewLayout 子类,如 UICollectionViewFlowLayout(用于线性布局,可以是水平或垂直滚动),来创建各种布局。苹果提供了一个默认的布局类 UICollectionViewFlowLayout,它支持流式布局(如网格和列表)。你可以通过继承 UICollectionViewLayout 来创建自定义布局,以实现更复杂的布局效果。

重用机制:为了提高性能,UICollectionView 重用单元格(cell)和视图(如头视图和尾视图),这有助于在滚动时管理内存使用。

数据源和代理:UICollectionView 通过数据源(UICollectionViewDataSource)和代理(UICollectionViewDelegate)与数据模型交互,处理数据的显示和用户交互。

选择和高亮:通过代理方法,可以处理用户的选中和取消选中操作,以及单元格的高亮显示。

拖拽和重新排序:UICollectionView 支持拖拽操作,允许用户重新排序单元格。

自定义绘制:我们可以自定义 UICollectionViewCell 的内容,包括布局、视图和动画效果。

UICollectionView组成及常用方法

组成

UICollectionViewFlowLayout:这是一个 UICollectionViewLayout 的子类,提供了线性布局(行和列)。它允许你定义项目的尺寸、行间距、列间距、分区的边距等。

UICollectionViewCell:这是 UICollectionView 中的单个项目,类似于 UITableView 中的 cell。你可以自定义这个 cell 来展示你的数据。

UICollectionReusableView:这是用于创建分区头(section headers)和分区尾(section footers),以及其他补充视图。

DataSource:定义了 collection view 中的数据,必须实现 UICollectionViewDataSource 协议。

Delegate:处理用户的交互,比如选中项目,必须实现 UICollectionViewDelegate 协议。

常用方法

  UICollectionView 继承于 UIScrollView,UICollectionViewDelegate 协议继承于 UIScrollViewDelegate 协议。所以在使用 UICollectionView 的时候,可以直接使用 UIScrollView 的各个属性方法。

UIScrollView 中有几个重要的属性,contentSize用来标识 UIScrollView 的滚动范围contentOffset 用来设置视图原点与可视区域左上角的距离contentInset 可用通过 UIEdgeInsetMake(10,10,10,10) 的方法设置一个内边框,这个值可以是负的,能使视图超出可视的滚动范围。
我们可以通过 setContentOffset:animated: 将视图滚动到某一个位置,也可以使用 scrollRectToVisible:animated: 将某块 rect 滚动到可视区域内(如果已经可见则不会滚动)。

UICollectionViewDataSource 协议方法(这些方法必须实现,以便提供 collection view 的数据):

numberOfSectionsInCollectionView://返回 collection view 中的分区数量。

collectionView:numberOfItemsInSection://返回指定分区中的项目数量。

collectionView:cellForItemAtIndexPath://为指定的 indexPath 配置并返回一个 cell。

collectionView:viewForSupplementaryElementOfKind:atIndexPath//为指定的分区和补充元素(如分区头或尾)配置并返回一个补充视图。

UICollectionViewDelegate 协议方法(这些方法用于处理用户的交互和自定义 collection view 的行为):

collectionView:didSelectItemAtIndexPath://当用户选中一个项目时调用。

collectionView:didDeselectItemAtIndexPath://当用户取消选中一个项目时调用(如果允许多选)。

collectionView:willDisplayCell:forItemAtIndexPath://在 cell 即将显示在屏幕上时调用。

collectionView:didEndDisplayingCell:forItemAtIndexPath://当 cell 从屏幕上消失时调用。

UICollectionView 布局方法(这些方法与布局相关,通常在自定义 UICollectionViewLayout 时使用):

collectionView:layout:sizeForItemAtIndexPath:
//返回指定项目的大小。

collectionView:layout:insetForSectionAtIndex:
//返回指定分区的内边距。

collectionView:layout:minimumLineSpacingForSectionAtIndex:
//返回指定分区的行间距。

collectionView:layout:minimumInteritemSpacingForSectionAtIndex:
//返回指定分区的列间距。

collectionView:layout:referenceSizeForHeaderInSection:
//返回分区头的大小。

collectionView:layout:referenceSizeForFooterInSection:
//返回分区尾的大小。

UICollectionView 自定义方法:

registerClass:forCellWithReuseIdentifier:
//注册一个 cell 类和其重用标识符。

registerNib:forCellWithReuseIdentifier:
//注册一个 cell 的 nib 文件和其重用标识符。

registerClass:forSupplementaryViewOfKind:withReuseIdentifier:
//注册一个补充视图类和其重用标识符。

registerNib:forSupplementaryViewOfKind:withReuseIdentifier:
//注册一个补充视图的 nib 文件和其重用标识符。

dequeueReusableCellWithReuseIdentifier:forIndexPath:
//重用或创建一个 cell。

dequeueReusableSupplementaryViewOfKind:withReuseIdentifier:forIndexPath:
//重用或创建一个补充视图。

UICollectionView 更新和动画方法:

reloadData//重新加载 collection view 的所有数据。

performBatchUpdates:completion://执行一系列的更新操作,并提供动画。

insertSections://插入分区。

deleteSections://删除分区。

reloadSections://重新加载分区。

insertItemsAtIndexPaths://插入项目。

deleteItemsAtIndexPaths://删除项目。

reloadItemsAtIndexPaths://重新加载项目。

moveItemAtIndexPath:toIndexPath://移动项目。

UiCollectionView的基本使用及代码示例

  1. 定义 UICollectionView 和 UICollectionViewLayout
// 创建 layout
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.itemSize = CGSizeMake(80, 80); // 设置每个 item 的大小
layout.minimumLineSpacing = 10; // 设置行间距
layout.minimumInteritemSpacing = 10; // 设置列间距
layout.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10); // 设置分区边距

// 创建 collection view
UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:layout];
collectionView.backgroundColor = [UIColor whiteColor];
[self.view addSubview:collectionView];

// 设置 dataSource 和 delegate
collectionView.dataSource = self;
collectionView.delegate = self;
  1. 注册 Cell 和 Supplementary Views
// 注册 cell
[collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"];

// 注册分区头
[collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"Header"];
  1. 实现 DataSource 方法
// 返回分区数量
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return 1; // 一个分区
}

// 返回每个分区中的项目数量
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return 25; // 这个分区有 25 个项目
}

// 配置并返回 cell
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
    // 配置 cell
    cell.backgroundColor = [UIColor redColor];
    return cell;
}
  1. 实现 Delegate 方法(可选)
// 选中项目
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"选中了项目 %ld", (long)indexPath.item);
}
  1. 配置 Supplementary Views
// 添加分区头
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
    UICollectionReusableView *header = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"Header" forIndexPath:indexPath];
    header.backgroundColor = [UIColor blueColor];
    return header;
}

总结

  关于UICollectionView的基本用法,我暂时学到这里,还有更深层次的大家可以看看这篇参考文章,这篇文章讲的非常详细,具体的用法还需在后续学习中多多体悟。

参考文章:一篇较为详细的 UICollectionView 使用方法总结

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

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

相关文章

Linux性能调优之使用BPF工具观测CPU性能指标

写在前面 博文内容涉及工具来自《BPF Performance Tools》 一书,CPU性能指标涉及: 系统短期创建的线程进程跟踪进程线程的CPU运行时长,脱离时长统计线程的运行队列长度,等待延时时间,有多少线程在等待,多核…

python语言入门必须要学习的模块化编程案例游戏---画图案例(三)【源码大全】

彩虹五角星 import turtle #引用turtle库 q turtle.Pen() #构造画笔 turtle.bgcolor("black") …

java基于SpringBoot+Vue+uniapp微信小程序的自助点餐系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

(悬臂)梁结构固有频率理论求解

文章目录 0、背景1、梁固有频率的理论解法1.1 简支梁和悬臂梁1.2 其他支撑形式的梁2、支座带旋转弹簧的悬臂梁固有频率求解3、算例及仿真0、背景 为了给风电塔筒结果的ABAQUS模型中添加支座弹簧,需要先搞清楚ABAQUS中弹簧单元的性质。很遗憾,网络上关于土弹簧的资料很少,帮…

【Linux】从 fork() 到 exec():理解 Linux 进程程序替换的魔法

1.前言 进程程序替换是指一个进程用另一个新的可执行程序来替换当前正在执行的程序,这个过程通过通过exec系列函数完成。在Linux或UNIX系统中,进程程序替换通常发生在一个进程通过fork()创建了子进程之后,子进程用exec()函数加载和执行另一个…

HTTP(HyperText Transfer Protocol)协议

前言 HTTP作为应用层协议,定义了客户端与服务器之间的通信规则,使得浏览器或其他客户端程序能够请求并获取Web服务器上的超文本信息。 在分布式、协作式的超媒体信息系统中,HTTP协议扮演着核心角色,它支持了信息的组织、检索和呈现…

ChatGPT01-preivew体验报告:内置思维链和多个llm组合出的COT有啥区别呢?丹田与练气+中学生物理奥赛题测试,名不虚传还是名副其实?

一个月前,o1发布的时候,我写了篇文章介绍 逻辑推理能力堪比博士生,OpenAI发布全新AI模型系列: o1 - 大模型或许进入新阶段,还翻译了官方的介绍 解密OpenAI o1是如何让LLMs获得逻辑推理能力的 - CoT * RL,也…

Ribbon客户端负载均衡策略测试及其改进

文章目录 一、目的概述二、验证步骤1、源码下载2、导入IDE3、运行前修改配置4、策略说明5、修改策略 三、最终结论四、改进措施1. 思路分析2. 核心代码3. 测试页面 一、目的概述 为了验证Ribbon客户端负载均衡策略在负载节点失效的情况下,是否具有故障转移的功能&a…

学习 UE5 的一些前置操作总结

随着 Unity, Godot 这些引擎都玩抽象,主动捅自己一刀后,UE5 的风头不可谓不盛,本着多学一点免得失业的思路方针,咱也研究了一下 UE5 引擎,然后发现想要开始使用 UE5 ,包含了很多前置操作,这里总…

Java项目-基于springboot框架的家具商城系统项目实战(附源码+文档)

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…

使用Yolov10和Ollama增强OCR

1. 训练自定义 Yolov10 数据集 利用物体检测增强 OCR 的第一步是在数据集上训练自定义 YOLO 模型。YOLO(只看一遍)是一种功能强大的实时对象检测模型,它将图像划分为网格,使其能够在一次前向传递中识别多个对象。这种方法非常适合…

AI大模型开发架构设计(14)——基于LangChain大模型的案例架构实战

文章目录 基于LangChain大模型的案例架构实战1 LangChain 顶层架构设计以及关键技术剖析LangChain 是什么?LangChain的主要功能是什么?LangChain 顶层架构设计LangChain 典型使用场景:QA 问答系统LangChain 顶层架构设计之 Model I/OLangChain 顶层架构…

No.17 笔记 | XXE漏洞:XML外部实体注入攻击

1. XXE漏洞概览 XXE(XML External Entity)是一种允许攻击者干扰应用程序对XML输入处理的漏洞。 1.1 XXE漏洞比喻 想象XML解析器是一个听话的机器人,而XXE就是利用这个机器人的"过分听话"来获取不应该获取的信息。 1.2 XXE漏洞危…

基于SSM汽车零部件加工系统的设计

管理员账户功能包括:系统首页,个人中心,员工管理,经理管理,零件材料管理,产品类型管理,产品信息管理,产品出库管理,产品入库管理 员工账号功能包括:系统首页…

spring-cloud-alibaba-nacos-config2023.0.1.*启动打印配置文件内容

**背景:**在开发测试过程中如果可以打印出配置文件的内容,方便确认配置是否准确;那么如何才可以打印出来呢; spring-cloud-alibaba-nacos-config 调整日志级别 logging:level:com.alibaba.cloud.nacos.configdata.NacosConfigD…

Java爬虫:获取商品销量详情API返回值的实战指南

在数字化时代,数据已成为电商运营的核心。商品销量数据不仅反映了市场的需求和趋势,还能为商家提供决策支持。通过Java爬虫技术,我们可以高效地获取这些数据,从而深入分析商品的市场表现。 为何选择Java爬虫获取销量数据 自动化处…

股票与基金资料收集

声明:本内容是网上资料的收集与整理而成,不定时更新。仅供参考,不构成任何投资建议。 目录: 一、股票 1、黄金交叉和死亡交叉 2、技术指标 3、T、TR、THR含义 二、基金 平准基金 一、股票 1、黄金交叉和死亡交叉 “黄金交…

【C++_string类练习】仅仅反转字母

题目链接:仅仅反转字母 解题思路: 这种反转字符的题目我第一个想到的方法就是:双指针 一个指针在前start,一个指针在后back, 如果指针所指向的位置的值是字母,那么两个指针位置的值就进行交换&#xff0…

P2-3与P2-4.【C语言基本数据类型、运算符和表达式】第三节与第四节

讲解视频: P2-3.【基本数据类型、运算符和表达式】第三节 P2-4.【基本数据类型、运算符和表达式】第四节 目录 必备知识与理论 任务实施 必备知识与理论 C语言中把除了控制语句和输入输出以外的几乎所有的基本操作都作为运算符处理。 其运算符和表达式数量之多&a…

以简单组合优化为例讨论计算复杂性

此为课题组所指导本科生和低年级硕士生学习组合优化问题汇报 所用教材:北京大学屈婉玲教授《算法设计与分析》 课程资料:https://www.icourse163.org/course/PKU-1002525003 承诺不用于任何商业用途,仅用于学术交流和分享 更多内容请关注课题…