【iOS】暑期第一周——ZARA app仿写

news2024/11/18 7:25:07

目录

  • 前言
  • 无限轮播图
  • 分栏控件和滚动视图
  • 自定义cell
  • 遇到的问题
    • 调整图标大小
    • 单元格附件视图设置
  • 总结

前言

  暑假学习的第一周任务是对ZARA app进行仿写,充分运用之前学习的Objective-C语言和UI控件。我在编写demo的过程中遇到了一些问题,特写该博客作为学习笔记。

无限轮播图

  刚打开ZARA app,我们在首页可以看到有一个商品展示的自动轮播图,无论是用图片两侧的按钮还是自动轮播,商品图片在视觉上给人一种无限循环轮播的效果。无限轮播图实质上是一个UIScrollView滚动视图控件,我们这里可以令ViewController遵循UIScrollViewDelegate协议,然后在

– (void)scrollViewDidScroll:(UIScrollView *)scrollView {}

方法里实现就行。方法里的编写思路是让他滚动到第六张图(注:我首页的无限轮播图为五张),也就是最后一张图时,让第一张图成为他的下一张图。

【代码如下】

//无限轮播实现部分
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat contentOffsetX = scrollView.contentOffset.x;
    CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;
    CGFloat contentWidth = scrollView.contentSize.width;
    
    if (contentOffsetX >= contentWidth - screenWidth) {
        [scrollView setContentOffset:CGPointMake(screenWidth, 0) animated:NO];
        self.page.currentPage = 0;
    } else if (contentOffsetX <= 0) {
        [scrollView setContentOffset:CGPointMake(contentWidth - 2 * screenWidth, 0) animated:NO];
        self.page.currentPage = 4;
    } else {
        self.page.currentPage = (contentOffsetX / screenWidth) - 1;
    }
}

至于自动轮播,只需要写一个自动播放的函数,添加视图偏移和控制视图滚动的定时器就可以了,下面给出代码示例:

//自动轮播实现部分(定时器)
- (void)autoScroll
{
    CGFloat width = [UIScreen mainScreen].bounds.size.width;
    [_scrollView setContentOffset:CGPointMake(_scrollView.contentOffset.x + width, 0) animated:YES];
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self.timer invalidate];
    self.timer = nil;
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    self.timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(autoScroll) userInfo:nil repeats:YES];
}

至于图片左右的按钮调节部分,只要创建左右两个按钮。调节好Button在视图里的放置位置,为按钮添加事件函数(即按下左按钮,当到第一张图片时,如果继续按下左按钮,将会把滚动视图偏移到最后一张;同理,按下右按钮,当到最后一张图片时,如果继续按下右按钮,将会把滚动视图偏移到第一张),这里主要用到UIPageControl控件。下面给出按下按钮触发的事件函数代码:

//按压按钮触发事件函数
- (void)pressLeft
{
    [self.timer invalidate];
    self.timer = nil;
    int nowPage = _scrollView.contentOffset.x / self.view.frame.size.width;
    _scrollView.contentOffset = CGPointMake(self.view.frame.size.width * (nowPage - 1), 0);
    if (nowPage == 1) {
        _scrollView.contentOffset = CGPointMake(self.view.frame.size.width * 5, 0);
    }
    self.timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(autoScroll) userInfo:nil repeats:YES];
}
- (void)pressRight
{
    [self.timer invalidate];
    self.timer = nil;
    int nowPage = _scrollView.contentOffset.x / self.view.bounds.size.width;
    _scrollView.contentOffset = CGPointMake( self.view.bounds.size.width * (nowPage + 1), 0);
    if (nowPage == 6) {
        _scrollView.contentOffset = CGPointMake(self.view.bounds.size.width * 4, 0);
    }
    self.timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(autoScroll) userInfo:nil repeats:YES];
}

【效果图】
首页的效果图如下:
在这里插入图片描述

分栏控件和滚动视图

  在商品页面,主要是实现滚动视图和分栏控件,并实现分栏控件与滚动视图的同步——在点击分栏控件时,滚动视图会随之变到相应的位置,在滑动视图时,分栏控件同理,一般用于在商品分类展示时,商品类名与图片相对应。思路就是添加代码将滚动视图的偏移量转化成分栏控件的索引,同理在滚动视图也添加受控件索引的偏移函数。下面给出代码示例:

- (void)valueChanged
{
    NSInteger index = _segControl.selectedSegmentIndex;
    CGFloat x = index * self.view.frame.size.width;
    _scrollView.contentOffset = CGPointMake(x, _scrollView.contentOffset.y);
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat offsetX = scrollView.contentOffset.x;
    CGFloat width = self.view.frame.size.width;
    NSInteger index = offsetX / width + 0.5;
    if (_segControl.selectedSegmentIndex != index) {
        _segControl.selectedSegmentIndex = index;
    }
}

效果图如下:
在这里插入图片描述

自定义cell

  用户页面本质上就是一个自定义的tableViewCell视图,自定义cell的使用,这里注意不同的位置,cell单元格的高度和内容不同,通过索引来区别和分类进行单元格的绘制都可以。
  除此之外,还需要实现用户在第一个单元格时,进入自己的个人信息页面,只需要给第一个单元格添加事件,该事件需要推出一个新的界面。
这里主要给出新界面的cell函数:

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if ([self.reuseIdentifier isEqualToString: @"cell"]) {
        self.imageView2 = [[UIImageView alloc] init];
        [self.contentView addSubview: _imageView2];
        
        self.label1 = [[UILabel alloc] init];
        [self.contentView addSubview:_label1];
        
        self.label2 = [[UILabel alloc] init];
        [self.contentView addSubview:_label2];
    }
    return self;
}

效果图:
在这里插入图片描述
点击第一个单元格后:
在这里插入图片描述

遇到的问题

  在仿写时,遇到的主要问题有两个。第一个是在网上下载的图标通常不是我们想要的尺寸,我们如何得到自己想要的image的大小并重新呈现在画布上;第二个问题是,在用户页面,用户点击单元格选中后,单元格呈现出被点击的灰色状态,如何在用户松手后变回原来的状态。

调整图标大小

下面以商品页面的图标为例,给出代码:

    UIImage *tabImage = [UIImage imageNamed:@"shopping.png"];
    CGSize newSize = CGSizeMake(30, 30);
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
    [tabImage drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

这里通过使用 UIGraphicsBeginImageContextWithOptions 和相关方法,可以调整图像的大小,并将其用作 UITabBarItem 的图标。
drawInRect:方法中的参数:newSize 是上下文的大小,NO 表示图像是否不透明(透明),0.0 表示使用设备的默认缩放因子。

单元格附件视图设置

一般要用到以下两行代码(这里以cell为示例):

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    cell.selectionStyle = UITableViewCellSelectionStyleDefault;

下面给出解释:

  • accessoryType 属性用于设置单元格右侧显示的附件视图类型。UITableViewCellAccessoryDisclosureIndicator 是一个右箭头图标,通常用于指示点击该单元格会导航到另一个视图控制器。
    其他可用的 UITableViewCellAccessoryType 类型包括:

UITableViewCellAccessoryNone: 无附件视图
UITableViewCellAccessoryCheckmark: 勾选标记
UITableViewCellAccessoryDetailButton: 详情按钮
UITableViewCellAccessoryDetailDisclosureButton: 详情披露按钮

  • selectionStyle 属性用于设置单元格被选中时的样式。
    UITableViewCellSelectionStyleDefault 是默认的选择风格,通常是灰色背景。
    其他可用的 UITableViewCellSelectionStyle 类型包括:>

UITableViewCellSelectionStyleNone: 无选择风格(即单元格被点击时不会改变背景)
UITableViewCellSelectionStyleBlue: 蓝色背景(已被废弃)
UITableViewCellSelectionStyleGray: 灰色背

总结

  因为离UI学习过去了快两个月,对于部分OC和UI知识有所遗忘,刚开始编写demo会比较慢,在仿写ZARA中比较重要的是自定义cell和TableView,同时也要注意页面的布局,尽量让页面看起来美观。总之,ZARA是UI学习完的基础练手项目,不仅简单回顾了UI的基础知识,也为后面网易云app仿写作了铺垫。

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

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

相关文章

微信小程序配置访问服务器失败所发现的问题及解决方案

目录 事前现象问题1&#xff1a;问题现象&#xff1a;问题分析&#xff1a; 问题2&#xff1a;问题现象&#xff1a;问题分析&#xff1a;解决方案&#xff1a; 事后现象 事前现象 问题1&#xff1a; 问题现象&#xff1a; 在本地调试时&#xff0c;一切顺利&#xff0c;但一…

2.10.批量归一化

批量归一化 ​ 损失出现在最后&#xff0c;所以后面的层训练比较快&#xff0c;而数据在最底部&#xff0c;则&#xff1a; 底部的层训练较慢底部层一变化&#xff0c;所有都会跟着变化最后的层需要重新学习多次 ​ 最后导致收敛变慢。 ​ 或许我们可以通过固定输出和梯度的…

古文:李密《陈情表》

原文 臣密言&#xff1a;臣以险衅&#xff0c;夙遭闵凶。生孩六月&#xff0c;慈父见背&#xff1b;行年四岁&#xff0c;舅夺母志。祖母刘愍臣孤弱&#xff0c;躬亲抚养。臣少多疾病&#xff0c;九岁不行&#xff0c;零丁孤苦&#xff0c;至于成立。既无伯叔&#xff0c;终鲜…

说说你对redis的理解

数据结构 String&#xff1a;缓存对象、常规计数、分布式锁、共享session信息 hash&#xff1a;&#xff08;包含键值对的无序散列表&#xff09; list&#xff1a;消息队列 set&#xff1a;聚合计算、点赞、公共关注、抽奖活动 zset&#xff1a;&#xff08;格式key、val…

【Streamlit学习笔记】Streamlit-ECharts热力图tooltip提示信息拓展

Streamlit-ECharts Streamlit-ECharts是一个Streamlit组件&#xff0c;用于在Python应用程序中展示ECharts图表。ECharts是一个由百度开发的JavaScript数据可视化库Apache ECharts 安装模块库 pip install streamlitpip install streamlit-echarts绘制热力图展示 在基础热力…

【强化学习的数学原理】课程笔记--5(值函数近似,策略梯度方法)

目录 值函数近似一个例子TD 算法的值函数近似形式Sarsa, Q-learning 的值函数近似形式Deep Q-learningexperience replay 策略梯度方法&#xff08;Policy Gradient&#xff09;Policy Gradient 的目标函数目标函数 1目标函数 2两种目标函数的同一性 Policy Gradient 目标函数的…

18967 六一儿童节

这个问题可以使用贪心算法来解决。我们可以先将孩子们的需求和巧&#xfffd;&#xfffd;&#xfffd;力的重量都进行排序&#xff0c;然后从最大的需求开始&#xff0c;找到能满足这个需求的最大的巧克力&#xff0c;将其分给这个孩子。然后继续处理下一个需求&#xff0c;直…

基于微信小程序+SpringBoot+Vue的自助点餐系统(带1w+文档)

基于微信小程序SpringBootVue的自助点餐系统(带1w文档) 基于微信小程序SpringBootVue的自助点餐系统(带1w文档) 基于微信小程序的自助点餐系统前后台分离&#xff0c;让商品订单&#xff0c;用户反馈信息&#xff0c;商品信息等相关信息集中在后台让管理员管理&#xff0c;让用…

【进程间通信机制】管道和 FIFO、信号、消息队列、信号量、共享内存、套接字(Socket)

进程详细剖析&#xff0c;移步&#xff1a;https://blog.csdn.net/Thmos_vader/article/details/140750535 进程间通信 前文介绍&#xff1a;如何通过 fork()或 vfork()创建子进程&#xff0c;以及在子进程中通过 exec()函数执行一个新的程序&#xff1b; 谓进程间通信指的是…

考题相似度 AI 分析 API 数据接口

考题相似度 AI 分析 API 数据接口 基于 AI 的相似度评估&#xff0c;专有 AI 模型&#xff0c;包含评估详情 。 1. 产品功能 基于自有专业模型进行 AI 智能分析&#xff1b;提供详细的相似度评分和结果描述&#xff1b;高效的模型分析性能&#xff1b;全接口支持 HTTPS&#…

乐鑫ESP32-H2设备联网芯片,集成多种安全功能方案,启明云端乐鑫代理商

在数字化浪潮的推动下&#xff0c;物联网正以前所未有的速度融入我们的日常生活。然而&#xff0c;随着设备的激增&#xff0c;安全问题也日益成为公众关注的焦点。 乐鑫ESP32-H2致力于为所有开发者提供高性价比的安全解决方案&#xff0c;这款芯片经过专门设计以集成多种安全…

【时时三省】unity test 测试框架 下载

目录 1&#xff0c;unity test 测试框架介绍 2&#xff0c;源码下载 3&#xff0c;目录架构 4&#xff0c;git for window 下载安装方法&#xff1a; 1&#xff0c;unity test 测试框架介绍 Unity是一个用于C语言的轻量级单元测试框架。它由Throw The Switch团队开发&#…

工作很难受,还要不要继续留在职场上?

先说结论&#xff1a;我非常赞同大家离开职场 虽然小编现实的工作是有关于人力资源的&#xff0c;高级点叫做猎头&#xff0c;低俗点讲就叫“人贩子” 原因可能和其他人不太一样&#xff0c;大家自行理解 1.现在的社会资源太少&#xff0c;“蛋糕”太小 大家要明白最重要的…

TVL 破 3 亿美元的 Pencils Protocol,缘何具备持续盈利的能力?

Pencils Protocol 是行业内首个 DeFi Auction 的一站式聚合收益平台&#xff0c;其不仅支持 LaucnhPad、Staking、杠杆挖矿等系列功能&#xff0c;并有望成为 Scroll 生态重要的流动性枢纽&#xff0c;其目前正在基于该体系为 LRT 赛道赋能&#xff0c;目前在质押端不仅支持 ST…

【公式】因果卷积神经网络公式与应用解析

因果卷积神经网络公式与应用解析 因果卷积神经网络的核心作用 因果卷积神经网络&#xff08;Temporal Convolutional Network, TCN&#xff09;是一种专为时间序列预测而设计的网络结构。它通过因果卷积层&#xff0c;能够有效地处理时间序列数据&#xff0c;捕捉时间序列中的…

mediasoup simulcast实现说明

一. 前言 二. 空间可伸缩与时间可伸缩 三. mediasoup simulcast实现代码分析 1. 推流客户端开启 simulcast 2. mediasoup服务端接收simulcast流 3. mediasoup服务端转发流数据给消费者 a. SimulcastConsumer类声明 b. 获取预估码率&#xff0c;切换SimulcastConsumer的目…

大脑自组织神经网络通俗讲解

大脑自组织神经网络的核心概念 大脑自组织神经网络&#xff0c;是指大脑中的神经元通过自组织的方式形成复杂的网络结构&#xff0c;从而实现信息的处理和存储。这一过程涉及到神经元的生长、连接和重塑&#xff0c;是大脑学习和记忆的基础。其核心公式涉及神经网络的权重更新…

优化算法:2.粒子群算法(PSO)及Python实现

一、定义 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;是一种模拟鸟群觅食行为的优化算法。想象一群鸟在寻找食物&#xff0c;每只鸟都在尝试找到食物最多的位置。它们通过互相交流信息&#xff0c;逐渐向食物最多的地方聚集。PSO就是基于这…

探索HTTPx:Python中的HTTP客户端新选择

文章目录 探索HTTPx&#xff1a;Python中的HTTP客户端新选择背景什么是HTTPx&#xff1f;安装HTTPx简单的库函数使用方法发送GET请求发送POST请求设置超时使用代理处理Cookies 应用场景异步请求连接池管理重试机制 常见问题与解决方案问题1&#xff1a;超时错误问题2&#xff1…