【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
英文地址,請注明出處:http://en.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-…