【iOS】ZARA仿写

【iOS】ZARA仿写

文章目录

  • 【iOS】ZARA仿写
    • 前言
    • 首页
    • 发现
    • 我的
      • 对姓名的更改
    • 总结

前言

暑假第一个的任务仿写ZARA 虽然不是特别难却有很多小细节需要注意

首页

点进程序出现的就是整个项目最主要的一个点,即首页的无限轮播图,不管是自动轮播还是手动滑动,前后图片的滑动都非常丝滑,即在视觉上有一种无限轮播效果,我这里面的具体思路是插入比你想看到的图片多两张图,即在第一张图前面插入最后一张图的假图,在最后一张图后面插入第一张图片的假图,当滚动到假图时悄悄跳回真实内容位置,视觉上实现 “无缝循环“

插入假图代码:

self.images = @[@"zara1.jpg", @"zara2.jpg", @"zara3.jpg", @"zara4.jpg", @"zara5.jpg"];
for (int i = 0; i < self.images.count + 2; i++) {NSString *imageName;if (i == 0) {imageName = [self.images lastObject];} else if (i == self.images.count + 1) {imageName = [self.images firstObject];} else {imageName = self.images[i - 1];}UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:imageName]];imageView.frame = CGRectMake(bounds.size.width * i, 0, bounds.size.width, bounds.size.height - 280);imageView.contentMode = UIViewContentModeScaleAspectFit;[self.scrollView addSubview:imageView];}

自动播放,是用NSTimer定时滑动,并在滑动后进行自动检测修正

- (void)startTimerScollView {self.timerScrollView = [NSTimer scheduledTimerWithTimeInterval: 2.5 target: self selector: @selector(pageToNext) userInfo: self repeats: YES];[[NSRunLoop mainRunLoop] addTimer:self.timerScrollView forMode:NSRunLoopCommonModes];
}
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;NSInteger pageIndex = scrollView.contentOffset.x / screenWidth;if (pageIndex == 0) {[scrollView setContentOffset:CGPointMake(screenWidth * self.images.count, 0) animated:NO];self.segmentView.selectedSegmentIndex = self.images.count - 1;} else if (pageIndex == self.images.count + 1) {[scrollView setContentOffset:CGPointMake(screenWidth, 0) animated:NO];self.segmentView.selectedSegmentIndex = 0;} else {self.segmentView.selectedSegmentIndex = pageIndex - 1;}
}

还有一点就是设置拖动时的视图不可移动,以及在拖动前后,对定时器的销毁和重新建立

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {[self.timerScrollView invalidate];self.timerScrollView = nil;self.isDragging = YES;
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {self.timerScrollView = [NSTimer scheduledTimerWithTimeInterval: 2.5 target: self selector: @selector(pageToNext) userInfo: self repeats: YES];self.isDragging = NO;
}

然后对于下面的页数的指示器可以使用UIPageControl或者设置无字且较小的UISegmentedControl控件来展示

首页效果图:

请添加图片描述

发现

对发现这一页没什么好说的,跟首页基本一样,只不过需要关闭自动滑动的内容,只允许用户手动滑动,再在屏幕上方安置一个分栏控件

- (void)setupSegmentView {CGRect bounds = self.view.bounds;self.segmentView = [[UISegmentedControl alloc] initWithItems:@[@"男装", @"女装", @"童装"]];self.segmentView.frame = CGRectMake(10, 110, bounds.size.width - 20, 50);[self.segmentView addTarget:self action:@selector(segmentChanged:) forControlEvents:UIControlEventValueChanged];self.segmentView.selectedSegmentIndex = 0;[self.view addSubview:self.segmentView];
}

请添加图片描述

我的

这个界面主要是一个自定义cell的应用,在之前的播客讲过,这里主要通过不同的section索引来进行不同单元格的绘制

- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.self.view.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.7];UILabel *titleLable = [[UILabel alloc] init];titleLable.text = @"个人主页";titleLable.frame = CGRectMake(168, 60, 200, 30);self.tableView = [[UITableView alloc] initWithFrame: self.view.bounds style: UITableViewStyleGrouped];self.tableView.delegate = self;self.tableView.dataSource = self;//self.tableView.backgroundColor = [UIColor grayColor];[self.tableView registerClass: [MyTableViewCell class] forCellReuseIdentifier: str];[self.view addSubview: self.tableView];[self.view addSubview: titleLable];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {return 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {switch (section) {case 0:return 1;break;case 1:return 5;break;default:break;}return 0;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {if (indexPath.section == 0) {return 130;} else if (indexPath.section == 1) {return 60;}return 0;
}

请添加图片描述

对姓名的更改

在对姓名的更更改这里涉及了多界面传值中协议传值的一部分知识

通过设置 delegate 属性,并实现协议方法来实现从内层视图把name传回ThirdVC界面的传值逻辑

定义协议与代理属性:

@protocol ProfileViewControllerDelegate <NSObject>
- (void)profileViewController:(ProfileViewController *)controller didUpdateName:(NSString *)name;
@end
@property (nonatomic, weak) id<ProfileViewControllerDelegate> delegate;

实现协议方法用于传值

- (void)profileViewController:(ProfileViewController *)controller didUpdateName:(NSString *)name {if (!name || name.length == 0) {return;}NSIndexPath *targetIndexPath = [NSIndexPath indexPathForRow:0 inSection:0];MyTableViewCell *cell = (MyTableViewCell *)[self.tableView cellForRowAtIndexPath:targetIndexPath];if (cell) {cell.nameLabel.text = name;} else {[self.tableView reloadRowsAtIndexPaths:@[targetIndexPath] withRowAnimation:UITableViewRowAnimationNone];}self.userName = name;
}

其他有关传值的方法我会在后面学习后写出

效果图:
请添加图片描述

总结

刚开始第一个项目难度不是特别大,但是可能开始的时候对写的逻辑会不清晰从而导致写的时候会比较麻烦或者思路混乱,写的时候还是得理清思路,这样写的时候也会事半功倍

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

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

相关文章

Kubernetes Pod 调度基础

一、Replication Controller 和 ReplicaSet1、Replication ControllerReplication Controller&#xff08;复制控制器&#xff0c;RC&#xff09;RC 用来确保 Pod 副本数达到期望值&#xff0c;这样可以确保一个或多个同类 Pod 总是可用的。如果存在的 Pod 数量大于设定的值&am…

菜鸟的C#学习(二)

文章目录一、类的访问1、普通类继承抽象类2、普通类继承抽象类&#xff0c;抽象类继承接口&#xff0c;三者联系二、类中方法的访问2.1 抽象方法和虚方法2.2 虚方法和普通方法**1. 调用机制****2. 方法重写****3. 设计意图****4. 性能差异****5. 语法对比表****总结&#xff1a…

04 51单片机之数码管显示

文章目录1、前言2、数码管3、单个数码管引脚定义3-1、单个共阴极3-2、单个共阳极3-3、单个数码管引脚定义4、四位一体数码管引脚定义4-1、四位一体共阴极数码管4-2、四位一体共阳极数码管4-3、四位一体数码管引脚定义5、数码管原理图6、C51数组&#xff08;补充知识点&#xff…

【LLM】OpenRouter调用Anthropic Claude上下文缓存处理

背景 在使用OpenRouter调用Anthropic Claude大模型时&#xff0c;部分模型支持上下文缓存功能。当缓存命中时&#xff0c;调用成本会显著降低。虽然像DeepSeek这类模型自带上下文缓存机制&#xff0c;但本文主要针对构建Agent场景下&#xff0c;需要多次调用Anthropic Claude时…

【C++】第十七节—二叉搜索树(概念+性能分析+增删查+实现+使用场景)

好久不见&#xff0c;我是云边有个稻草人 《C》本文所属专栏—持续更新中—欢迎订阅 目录 一、二叉搜索树的概念 二、二叉搜索树的性能分析 三、二叉搜索树的插入 SearchBinaryTree.h test.cpp 四、⼆叉搜索树的查找 【只有一个3】 【有多个3】 五、⼆叉搜索树的删除…

Redis都有哪些数据结构,使用场景与原理解析

✅ String&#xff1a;字符串&#xff08;最常用、最简单的类型&#xff09;&#x1f4cc; 应用场景&#xff1a;计数器&#xff08;如&#xff1a;页面浏览量、点赞数、转发数等&#xff09;缓存单个值&#xff08;如&#xff1a;token、验证码、用户昵称&#xff09;分布式锁…

将EXCEL或者CSV转换为键值对形式的Markdown文件

# 创建命令行参数解析器parser argparse.ArgumentParser(description将 CSV 或 Excel 文件转换为带标头的 Markdown 格式)# 必需参数parser.add_argument(input_file, help输入文件路径 (CSV 或 Excel))parser.add_argument(output_file, help输出 Markdown 文件路径)# 可选参…

MySQL 配置性能优化实操指南:分版本5.7和8.0适配方案

在 MySQL 性能优化中&#xff0c;不同版本的特性差异会直接影响优化效果。本文基于 MySQL 5.7 和 8.0 两个主流版本&#xff0c;通过版本适配的配置代码、场景举例和通俗解释&#xff0c;让优化方案更精准落地。一、硬件与系统配置优化&#xff08;基础层优化&#xff09;1. 服…

【STM32实践篇】:串口通信

文章目录1. 串行通信与并行通信2. 异步通信与同步通信3. 单工&#xff0c;半双工和全双工通信4. 通信速率和接口标准5. USART 结构框图6. 串口电路6.1 串口之间的连接6.2 串口与 RS232 的转换和连接6.3 串口与 RS485 的转换和连接6.4 串口与 USB 的转换和连接7. USART 字符说明…

Trae IDE评测体验:通过 MCP Server - Figma AI Bridge 一键将 Figma 转为前端代码

Trae IDE评测体验&#xff1a;通过 MCP Server - Figma AI Bridge 一键将 Figma 转为前端代码 在现代前端开发中&#xff0c;从设计稿到可用页面的交付往往需要大量重复劳动&#xff1a;切图、手写样式、布局调整……而借助 MCP Server - Figma AI Bridge&#xff0c;我们可以…

文献阅读 250715-Atmospheric rivers cause warm winters and extreme heat events

Atmospheric rivers cause warm winters and extreme heat events 来自 <Atmospheric rivers cause warm winters and extreme heat events | Nature> ## Abstract: Definition: Atmospheric rivers (ARs) are narrow regions of intense water vapour transport in the …

线上协同办公时代:以开源AI大模型等工具培养网感,拥抱职业变革

摘要&#xff1a;在提倡线上协同办公的时代背景下&#xff0c;职场人需迅速提升工作能力以适应职业变革。培养网感成为时代所需&#xff0c;它为快速连接时代奠定基础。本文深入探讨了开源AI大模型、AI智能名片、S2B2C商城小程序源码等工具在培养网感过程中的重要作用&#xff…

Netty网络聊天室及扩展序列化算法

一、前言Netty是一个基于Java的高性能、事件驱动的网络应用框架&#xff0c;广泛应用于各种网络通信场景。本文将介绍如何使用Netty构建一个简单的网络聊天室&#xff0c;并扩展序列化算法来提高数据传输效率和灵活性。二、Netty网络聊天室的实现1. 项目结构我们将使用Maven构建…

基于单片机金沙河粮仓环境监测系统设计与实现

摘 要 本文围绕基于单片机的金沙河粮仓环境监测系统展开设计与实现研究。系统以单片机为核心&#xff0c;集成 DHT11、MQ - 135 等传感器&#xff0c;可实时精准监测粮仓温湿度、气体成分等关键环境参数。借助 LoRa、ESP8266 实现数据的可靠传输与远程通信 &#xff0c;OLED 屏…

如何解决Android Studio安装时无法下载SDK的问题(Windows、Linux、Mac解决方案大全)

如何解决Android Studio安装时无法下载SDK的问题&#xff08;Windows、Linux、Mac解决方案大全&#xff09; 前言 对于全栈开发者而言&#xff0c;安装 Android Studio 是迈向 Android 开发的第一步&#xff0c;但在 Windows、Linux、macOS 等不同平台上&#xff0c;经常会遇…

SQL Server从入门到项目实践(超值版)读书笔记 21

9.5 数据的内连接查询连接是关系数据库模型的主要特点&#xff0c;连接查询是关系数据库中最主要的查询&#xff0c;主要包括内连接、外连接等。内连接查询操作列出与连接条件匹配的数据行&#xff0c;它使用比较运算符比较被链接列的列值。具体语法格式如下&#xff1a;SELECT…

瑞芯微7月17日举办开发者大会,多款AIoT新品发布,触觉智能RK方案商报导

瑞芯微第九届开发者大会RKDC 2025将有多款新品发布。 据瑞芯微电子Rockchip此前宣布&#xff1a;该企业的本年度开发者大会RKDC 2025将于7月17~18日在福建福州海峡国际会展中心举行。本次瑞芯微开发者大会以“AIoT模型创新重做产品”为主题&#xff0c;关注传统IoT功能设备向场…

Eureka+Ribbon实现服务注册与发现

目录 一、相关文章 二、兼容说明 三、服务注册 四、服务发现 一、相关文章 基础工程&#xff1a;gradle7.6.1springboot3.2.4创建微服务工程-CSDN博客 Eureka服务端启动&#xff1a;https://blog.csdn.net/cherishSpring/article/details/149473554 Ribbon负载均衡&#…

数据库、HTML

一、数据库 数据库文件与普通文件区别: 普通文件对数据管理(增删改查)效率低2.数据库对数据管理效率高&#xff0c;使用方便 常用数据库: 1.关系型数据库: 将复杂的数据结构简化为二维表格形式 大型:0racle、DB2 中型:MySq1、sQLServer 小型:Sqlite 2.非关系型数据库以键值对…

RCE随笔(1)

哪些是可以执行代码执行&#xff1a;php代码。eval如&#xff1a;eval:<?php eval($_post[key]);eval&#xff1a;php中不被叫做函数叫动态执行命令assert&#xff1a;执行函数call_user_func_array<?php call_user_func_array(assert,array($_REQUEST[shu]));传入xxs-…