【iOS干货】:列表和网格视图的相互切换

Unity资源分析工具开发指南:从AssetBundle优化到性能调优 在游戏开发中,资源管理是影响应用性能和用户体验的核心环节。资源优化通过分析模型、贴图、音频等资产的导入设置、依赖关系和内存占用,从源头上控制包体大小和运行时效率。其技术价值在于将资源成本量化,为性能调优提供数据支撑,广泛应用于移动端游戏、大型应用等对安装包体积和内存敏感的场景。AssetBundle作为Unity中资源分发与热更新的关键技术,其打包策略和冗余检测直接决定了最终产品的性能表现。本文聚焦于Unity资产包分析工具的开发实践,详细拆解了资源清单统计、依赖关系分析、AssetBundle专项检测等核 阅读详情

前言

在很多电商 app 中,都有列表视图和网格视图的相互切换。例如京东和淘宝。

  • 列表视图
    列表视图

  • 网格视图
    网格视图
    很多人看到这个,第一眼想到的是用TableView和CollectionView来做切换,笔者刚开始也是认为这么做,后来发现还有一个非常的简单方法,就可以实现这个功能。

正文

  • 首先创建一个CollectionView。
- (UICollectionView *)collectionView
{
    if (!_collectionView)
    {
        UICollectionViewFlowLayout *flowlayout = [[UICollectionViewFlowLayout alloc] init];
        //设置滚动方向
        [flowlayout setScrollDirection:UICollectionViewScrollDirectionVertical];
        //左右间距
        flowlayout.minimumInteritemSpacing = 2;
        //上下间距
        flowlayout.minimumLineSpacing = 2;
        _collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(2 , 2 , self.view.bounds.size.width - 4, self.view.bounds.size.height - 4) collectionViewLayout:flowlayout];
        _collectionView.delegate = self;
        _collectionView.dataSource = self;
        _collectionView.showsVerticalScrollIndicator = NO;
        _collectionView.showsHorizontalScrollIndicator = NO;
        [_collectionView setBackgroundColor:[UIColor clearColor]];
        //注册cell
        [_collectionView registerClass:[GridListCollectionViewCell class] forCellWithReuseIdentifier:kCellIdentifier_CollectionViewCell];
    }
    return _collectionView;
}
  • 然后去京东商城抓取json数据,再去解析数据装入模型,objectWithDictionary:是将字典转化为模型,这个工具是我用* Runtime *写的,一行代码解析数据,具体使用方法可以参考我简书上另一篇文章【Objective-C中的Runtime】。
- (void)viewDidLoad 
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    // 默认列表视图
    _isGrid = NO;

    NSString *path = [[NSBundle mainBundle] pathForResource:@"product" ofType:@"json"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

    [self.view addSubview:self.collectionView];

    NSArray *products = dict[@"wareInfo"];
    for (id obj in products) {
        [self.dataSource addObject:[GridListModel objectWithDictionary:obj]];
    }
}
  • 再去自定义CollectionViewCell,给cell添加一个属性isGrid,用来判断是列表还是格子视图。
    .h文件:
#import <UIKit/UIKit.h>

#define kCellIdentifier_CollectionViewCell @"GridListCollectionViewCell"

@class GridListModel;

@interface GridListCollectionViewCell : UICollectionViewCell

/**
 0:列表视图,1:格子视图
 */
@property (nonatomic, assign) BOOL isGrid;

@property (nonatomic, strong) GridListModel *model;

@end

.m文件

#import "GridListCollectionViewCell.h"
#import "GridListModel.h"
#import "UIImageView+WebCache.h"

#define ScreenWidth ([UIScreen mainScreen].bounds.size.width)

@interface GridListCollectionViewCell ()

@property (nonatomic, strong) UIImageView *imageV;
@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UILabel *priceLabel;

@end

@implementation GridListCollectionViewCell

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self configureUI];
    }
    return self;
}

- (void)configureUI
{
    _imageV = [[UIImageView alloc] initWithFrame:CGRectZero];
    [self.contentView addSubview:_imageV];

    _titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    _titleLabel.numberOfLines = 0;
    _titleLabel.font = [UIFont boldSystemFontOfSize:14];
    [self.contentView addSubview:_titleLabel];

    _priceLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    _priceLabel.textColor = [UIColor redColor];
    _priceLabel.font = [UIFont systemFontOfSize:16];
    [self.contentView addSubview:_priceLabel];
}

- (void)setIsGrid:(BOOL)isGrid
{
    _isGrid = isGrid;

    if (isGrid) {
        _imageV.frame = CGRectMake(5, 5, self.bounds.size.width - 60, self.bounds.size.width - 60);
        _titleLabel.frame = CGRectMake(5, self.bounds.size.width - 45, ScreenWidth/2, 20);
        _priceLabel.frame = CGRectMake(5, self.bounds.size.width - 20, ScreenWidth/2, 20);
    } else {
        _imageV.frame = CGRectMake(5, 5, self.bounds.size.height - 10, self.bounds.size.height - 10);
        _titleLabel.frame = CGRectMake(self.bounds.size.height + 10, 0, ScreenWidth/2, self.bounds.size.height - 20);;
        _priceLabel.frame = CGRectMake(self.bounds.size.height + 10, self.bounds.size.height - 30, ScreenWidth/2, 20);;
    }
}

- (void)setModel:(GridListModel *)model
{
    _model = model;

    [_imageV sd_setImageWithURL:[NSURL URLWithString:model.imageurl]];
    _titleLabel.text = model.wname;
    _priceLabel.text = [NSString stringWithFormat:@"¥%.2f",model.jdPrice];
}

@end
  • 再添加一个切换视图的按钮,按钮的点击事件如下:
#pragma mark - Action

- (IBAction)onBtnClick:(id)sender
{
    _isGrid = !_isGrid;
    [self.collectionView reloadData];

    if (_isGrid) {
        [self.swithBtn setImage:[UIImage imageNamed:@"product_list_grid_btn"] forState:0];
    } else {
        [self.swithBtn setImage:[UIImage imageNamed:@"product_list_list_btn"] forState:0];
    }
}
  • 最后还要设置一下切换时的CollectionView的ItemSize。
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    if (_isGrid) {
        return CGSizeMake((ScreenWidth - 6) / 2, (ScreenWidth - 6) / 2 + 40);
    } else {
        return CGSizeMake(ScreenWidth - 4, (ScreenWidth - 6) / 4 + 20);
    }
}

这样子就大体实现了列表视图和网格视图的相互切换,是不是炒鸡简单。
Demo运行的效果图.gif

最后

由于笔者水平有限,文中如果有错误的地方,还望大神指出。或者有更好的方法和建议,我们可以一起交流。
附上本文的 demo 下载链接【GitHub】,配合 demo 一起看文章,效果会更佳。
如果你看完后觉得对你有所帮助,还望在 GitHub 上点个 star。赠人玫瑰,手有余香。

文档操作系统:模板驱动的自动化排版与专业交付 文档操作系统是一种将出版规范、排版逻辑与内容结构封装为可执行规则的技术范式,其核心在于通过参数化模板、结构化内容解析和确定性渲染引擎,实现高质量PDF的批量、稳定、低错误率生成。它不同于AI文本生成,强调专家经验固化、样式全局联动与品牌合规控制,技术价值体现在消除格式污染、保障跨平台兼容(PDF/A-1b)、支持多人实时协作及响应式预览。典型应用场景包括技术说明书、客户方案、培训手册与电子书等需高频、标准化交付的B2B内容生产。本文深入解析其云原生架构、五大子系统协同机制及约束式设计哲学,揭示模板如何成为可 阅读详情

相关推荐

IOS很好的网格视图布局(可变行变列)

很好的网格布局!

iOS CollectionView 列表&网格之间切换(带动画)

原文地址:https://www.hlzhy.com/?p=57 前言: 最近在写一个列表界面,这个列表能够在列表和网格之间切换,这种需求算是比较常见的。本以为想我们是站在大牛的肩膀上编程,就去找了下度娘和谷哥,但是并没有找到我想要的(找到的都是不带动画的切换)。既然做不了VC战士,那就自己动手丰衣足食。在我看来,所有的视图变化都应该至少带个简单的过渡动画,当然,过度使用华丽的动画效果也会...

努力,可能成功!放弃,注定失败! 696

Android中利用ListView和GridView实现列表视图和网格(图标)视图的相互切换显示

Android中利用ListView和GridView实现列表视图和网格(图标)视图的相互切换显示

【iOS】UICollectionView使用

总结了UICollectioinView的基本使用、参差瀑布流式和圆环式布局。其实算是特殊Flow布局的UITableView,但简单的列表仍可以使用UITableViewUICollectionView最大的优势就是通过自定义Layout,实现cell的布局,整体的思路就是:通过一些几何计算,设置好每个item的布局位置和大小一篇较为详细的 UICollectionView 使用方法总结

XY_Mckevince的博客 3190

仿淘宝列表、网格布局之间的切换

仿淘宝列表、网格布局之间的切换,用RecyclerView和ToolBar实现的,并对适配器进行了简单的封装

ios-商城的切换布局.zip

上次的商城布局是oc语言写的 这次是swift 自动布局 一行两个 切换成一行一个 相互切换

UITableView实现网格视图效果GridView

更好的支持iOS 5

CyonLeu的专栏 2240

Grid(list)view

gridview与listview的整合 不用再去一个一个去找了 里面有经常用的类型。

iOS开发中UICollectionView的用法详解第一篇(UICollectionViewLayout)

这篇文章主要讲解UICollectionViewLayout的用法。

我叫柱子哥 3075

深入解析“PROJ: proj_create_from_database: Cannot find proj.db”错误:从环境配置到打包实战

本文深入解析了“PROJ: proj_create_from_database: Cannot find proj.db”错误的根源与解决方案,涵盖环境配置、PyInstaller打包及跨平台兼容性处理。通过详细分析PROJ库路径问题及GDAL依赖关系,提供动态路径设置、资源文件打包等实战技巧,帮助开发者高效解决地理数据处理中的常见错误。

weixin_29074409的博客 445

告别BAPI!深入SAP S/4HANA BP框架:cl_md_bp_maintain维护客户主数据的正确姿势与性能优化

本文深入解析SAP S/4HANA中cl_md_bp_maintain框架的高效实践与架构设计,对比传统BAPI方式,展示其在业务伙伴(BP)主数据维护中的性能优势与现代化特性。通过详细代码示例和性能测试数据,揭示如何利用该框架实现批量处理、集中校验及智能错误恢复,助力企业从ECC向S/4HANA平滑迁移。

weixin_30596735的博客 358

uitableview 弹性_iOS UITableView/UICollectionView的嵌套和悬停的解决方案

应用情景情景一:情景一说明:是不是和tableView的Plain类型一样,其实这个是由两个列表实现的情景二:情况二说明:此时,就可以发现和普通的列表有些不一样了情景三:情景三说明:笔者最初就是为了实现这种情况,由于项目需求,需要防QQ空间,不同的是需要类型的切换,当时没想到好的解决方案,最后受同事启发,在其demo上进行修改,使得tableView可以满足大部分的悬停需求思路说明1、由于是两个t...

weixin_39586335的博客 794

AI 帮我写单测:pytest 覆盖率提升 40% 的协作日志

AI助力pytest测试覆盖率提升40%的实践总结 本文分享了作者通过AI协作提升Python项目测试覆盖率的实践经验。初始测试覆盖率仅45%的电商后端项目,通过系统化的AI协作策略(代码分析、场景矩阵设计、迭代优化)实现了显著改进。AI不仅生成312个高质量测试用例,更提供了测试设计思路和最佳实践建议。最终覆盖率提升至85%,发现并修复23个潜在bug,效率提升3倍。文章详细展示了用户服务、订单服务等核心模块的测试案例,以及分层Fixture设计、参数化测试等高级技巧。关键成功因素包括明确的协作边界、迭代

摘星编程的博客 3279

Sqribble文档自动化:模板驱动的PDF出版流水线解析

PDF电子书生成是内容创作者高频刚需,其本质是结构化文档排版问题——涉及封面设计、目录生成、页眉页脚、样式统一与响应式渲染等确定性任务。传统方案如Word或Canva依赖人工操作,易出错、难复用、协作低效;而基于模板驱动的文档自动化(Template-Driven Document Automation)技术,通过预置出版规则、语义化内容解析与云原生渲染引擎,将专业排版逻辑封装为零门槛工作流。该技术显著提升教育讲义、营销白皮书、课程手册等场景的交付效率与品牌一致性,尤其适合无专职设计师的中小团队。本文深入剖

354

FreeSWITCH彩铃与回铃音区别详解:从183/180信令到mod_da2检测模块

本文深入解析FreeSWITCH中彩铃与回铃音的技术差异,从183/180信令机制到mod_da2智能检测模块的实现原理。通过对比SIP协议中的早期媒体传输、回铃音补偿技术及实战案例,帮助开发者掌握VoIP系统中的关键音频处理技术,提升呼叫系统稳定性和用户体验。

tree8的博客 349

YOLOv11改进 - C3k2融合 | C3k2融合融合WDBB宽度多样分支模块(Width Diverse Branch Block)通过多尺度分支增强特征表征能力

本文着眼于灰度图像目标检测所面临的挑战,提出了增强型目标检测网络 YOLO - MIF,该网络整合了多种多信息融合策略以对 YOLOv8 网络进行改进。文章开篇介绍了一种可创建伪多通道灰度图像的技术,此技术能增加网络的通道信息,同时缓解潜在的图像噪声与虚焦模糊问题。随后运用网络结构重新参数化技术,在不增加推断时间的情况下提升网络的检测性能。此外,引入了一种新颖的解耦式检测头,增强了模型处理灰度图像时的表现能力。

魔改工程师的博客 770

Android 知识体系

Android归档前言 前言 感谢: Gityuan:Android系统架构开篇 刘望舒的博客:知识体系

许浑的博客 8199

yolov8涨点系列之轻量化主干网络替换

yolov8涨点系列之轻量化主干网络替换,以EfficientVit为例

zhang1379的博客 2887

Unity游戏动态数据可视化实战:XCharts插件应用与性能优化

数据可视化作为信息呈现的核心技术,通过将抽象数据转化为直观图形,帮助用户快速理解复杂信息。其原理基于视觉编码与交互设计,将数据映射为视觉元素如位置、长度、颜色等。在游戏开发领域,动态数据可视化技术价值尤为突出,能够实时反映游戏状态变化,增强玩家沉浸感与决策依据。应用场景广泛覆盖模拟经营、策略卡牌、RPG等游戏类型,常用于展示资源变化、战斗统计、进度追踪等关键信息。本文聚焦Unity引擎与XCharts插件的结合应用,深入探讨如何实现游戏数据的实时可视化呈现,并针对性能优化提供实践方案,特别关注抖音小游戏等W

weixin_33713707的博客 386

2026年职业院校技能大赛中职移动应用与开发—数字生活APP原型设计参考答案(含素材)

本模块以产品原型为目标,考查参赛选手熟练收集、分析和归纳客户需求,清晰梳理业务流程,熟练使用UI设计软件进行产品UI/UE设计,掌握正确的UI配色方案,设计出符合业务逻辑的人体工学移动App 原型优秀作品。

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 568

【WRF-Urban】URBPARM_LCZ.TBL 查找表解释及内容

URBPARM_LCZ.TBL 查找表解释及内容

WW、forever的博客 1754

HarmonyOS ArkTS API 24 Web 组件加载本地 html 网页文件网页与 ArkTS 双向通信交互教程

HarmonyOS 是华为推出的面向全场景的分布式操作系统,其应用开发框架基于 ArkUI 声明式编程范式,使用 ArkTS 作为主力开发语言。ArkTS 在 TypeScript 的基础上进行了扩展与约束,引入了 @Component、@State、@Builder 等装饰器,使开发者能以简洁、类型安全的方式构建高性能的移动应用界面。声明式 UI 的核心思想是"状态驱动视图"。开发者只需描述界面在某一状态下的样子,框架会自动在状态变化时重新渲染受影响的组件。这与传统的命令式 UI(如 Android Vi

wilbur1688的博客 245

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

智能食材库存管理应用HarmonyOS ArkTS API 24构造函数constructor(data: FoodItem) 接收接口对象,并逐字段赋值给this把“数据形状“与“可观察行为“解耦

在移动互联网与智能穿戴设备高度普及的今天,"习惯养成"已经从一个模糊的自我管理理念,演变为一个可量化、可追踪、可视化的数字化产品赛道。越来越多的人希望借助手中的智能终端,把"早起、冥想、阅读、运动"这些抽象的自律行为,转化为一条条清晰的数据曲线和一张张可触摸的打卡卡片。而鸿蒙生态(HarmonyOS)凭借其跨设备协同、分布式软总线以及声明式 UI 开发框架 ArkUI,为这类注重"轻量化交互 + 即时反馈"的生活方式类应用提供了极为理想的生长土壤。本应用正是一款面向"晨间场景"深度打磨的习惯追踪工具。它聚焦

2301_79516720的博客 81

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

模板驱动型文档自动化工具:让内容秒变专业PDF

模板驱动型文档自动化工具,是一种基于预设排版规则与结构化映射的轻量级出版解决方案。其核心原理是将内容输入(如Markdown、Word、网页)经语义解析后,按模板内嵌的层级规则、分页逻辑与布局协议自动渲染为格式统一的PDF。相比AI写作工具侧重内容生成,它聚焦‘内容转译’,以确定性保障交付稳定性,显著提升知识产品化效率。典型应用场景包括营销白皮书、客户案例集、培训手册及销售资料等高频、结构化、需快速交付的B2B文档生产。Sqribble正是该范式的代表性实践。

weixin_34090562的博客 349

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【前端】Vue.js实现网格列表布局转换

网格列表布局转换 实现效果: 实现代码及注释: <!DOCTYPE html> <html> <head> <title>布局转换</title> <meta charset="utf-8"> ...

nqxcwl的专栏 1522

iOS App主题皮肤切换功能简介和具体实现详解 附有源码

分享一个朋友的人工智能教程。比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看。 0.换肤的应用场景 一般情况下某些App在节假日(春节、中秋、国庆等)切换主题,显得更适合当下的气氛; 切换白天或夜晚模式; 用户不喜欢App默认的主题更换为其它主题; 1. 主题皮肤功能切换介绍 主题切换就是根据用户设置不同的主题,来动态改变用户的界面,一般是换图片或者背景图片、文字这两种情况: ...

人不风流枉少年 1万+
上一篇: 【iOS打ipa包】:使用终端实现自动打包
leejay_carson
博客等级 码龄11年 1粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值