暑假第二周任务——3Gshare的仿写

3GShare的仿写

登陆注册页面

这个界面的UI比较简单,比较困难的地方在于限制我们的输入长度以及我们输入的字符类型。

请添加图片描述

在这里我是通过在textField的代理中设计限定输入字符的内容,从而实现限制输入长度和限制输入字符的内容,下面给出相关的代码。

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {NSCharacterSet *charSet = [[NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"] invertedSet];NSString *filteredStr = [[string componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@""];if (range.length == 1 && string.length == 0) { // 这一个判断是为防止他出现一个到达限定字数后,删除键失效的一个问题return YES;} else if (textField.text.length >= 15) { //。限定长度textField.text = [textField.text substringToIndex:15]; // 截取对应长度return NO;} else if ([string isEqualToString:filteredStr] && textField.text.length <= 15) {return YES;}return NO;
}

这里我为了判断是否存在重复注册的问题,我通过两次传值来给不同界面传入登陆和注册的一个字典,先通过属性传值将数组内容传入注册界面,再通过协议传值的方法将后一个页面注册的字典传回登陆页面,这样就可以实现一个登陆注册的效果。

首页

请添加图片描述

首页这部分比较重要的内容是有关于点赞传值的部分,我们要保证在传值前后我的点赞可以在两个页面中间实现一个传值的效果,这里我是采用了一个全局变量,在通过判断这个全局变量来判断点赞的一个状态,注意将全局变量定义在这个AppDelegate,因为这样可以被我们全部的文件访问。

@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (nonatomic, assign) BOOL selected;
@end
- (void)press1:(UIButton *)btn {btn.selected = !btn.selected;AppDelegate* mydelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;mydelegate.selected = btn.selected;
}

其次就是无限轮播图在我们滑动UITableView的时候仍然需要滑动,所以我们需要添加一条代码来修改这个部分的内容。

 [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

笔者对于RunLoop还没有进行一个较为深的学习,仅仅只是知道这个段代码可以起到让UIScrollView在UiTableView被滑动的时候不停止滑动的效果。

这个页面主要就是一个自定义cell和一个滑动视图两者构成。

搜索页面

请添加图片描述

这个页面主要由UIButton构成,上面使用了一个UISearchBar这个控件,这个页面比较简单,就不在赘述。

上传页面

请添加图片描述

这里是一个上传页面,我设计的是永远显示的上传后点击的第一张,这里主要和前面照片墙的方式一样,同样是给UIButton添加两个状态,如果点击后就会给右下角添加一个对勾,表明他被选中的一个状态。这里主要是通过一个可变数组添加和删除来保存返回照片的第一张图片。

同时这个页面还有一个折叠cell,折叠cell主要是通过一个可变数组和一个UItableView来实现这部分内容。下面给出相关代码:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {NSString* str = _ary[indexPath.section];[_ary removeObjectAtIndex:indexPath.section];//删除这个位置的字符串[_ary insertObject:str atIndex:0];//插入在首位[tableView reloadData]; //记得刷新单元格[self press:_btn]; //显示所有内容
}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"id"];[cell setSelectionStyle:UITableViewCellSelectionStyleNone];cell.textLabel.text = self.ary[indexPath.section];return cell;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {return 30;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {return 4;
}
-(void)press:(UIButton*)btn {btn.selected = !btn.selected;if (btn.selected) {self.tableView.frame = CGRectMake(240, 180, 120, 120);} else {self.tableView.frame = CGRectMake(240, 180, 120, 30);}
}

文章页面

请添加图片描述

这个页面比较简单就是单纯的一个分栏控件再加上UIScrollView的一个嵌套,以及UIScrollView中嵌套着一个UITableView的控件的组成。

活动页面

请添加图片描述

这个页面就是简单的一个自定义cell的内容。

个人主页

请添加图片描述

下面就是一个个人主页的部分,这个部分内容比较多写起来比较麻烦,这个部分的重点还主要是如何保存我们被pop的视图控制器。

if (!self.personal) {self.personal = [[personalCenterViewController alloc] init];}[self.navigationController pushViewController:self.personal animated:YES];
}

这段代码可以让我的视图控制器只创建一次,从而防止他被反复创建从而不能保存原来持有状态的问题,剩下其实都是有关自定义cell的内容。

小tips

在这个项目中还学习了一些UITableView设计的一些技巧,下面将给出相关代码。

  1. 首先我们可以通过给设置空白VIew的方式来给我们的UITableView设置组间距。
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {if(section == 0) {return 0.001;} else {return 12;}
}
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{return 12;
}
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {UIView *headerView;if (section == 0) {headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 0.001)];} else {headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 12)];}return headerView;
}
  1. 可以通过给tabBar添加一个VIew来遮盖底部白条。
UIView* view = [[UIView alloc] initWithFrame:CGRectMake(0, 50, WIDTH, 50)];view.backgroundColor = [UIColor colorWithRed:23 / 255.0f green:23 / 255.0f blue:23 / 255.0f alpha:1];[self.tabBarController.tabBar addSubview:view];
  1. 自定义导航栏返回按钮
 UIButton* leftButton = [UIButton buttonWithType:UIButtonTypeSystem];[leftButton setImage:[UIImage imageNamed:@"back_img.png"] forState:UIControlStateNormal];[leftButton addTarget:self action:@selector(returnback) forControlEvents:UIControlEventTouchUpInside];[leftButton setTitle:@"返回" forState:UIControlStateNormal];leftButton.tintColor = UIColor.whiteColor;UIBarButtonItem* left = [[UIBarButtonItem alloc] initWithCustomView:leftButton];self.navigationItem.leftBarButtonItem = left;
  1. 通过用一个UILabel来作为titleView的方式来设置我们导航栏中间字体的样式
UILabel* titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 40, 40)];titleLabel.font = [UIFont systemFontOfSize:26];titleLabel.textColor = [UIColor whiteColor];titleLabel.text = @"SHARE";_tagFirst = 110;_tagSecond = 130;self.navigationItem.titleView = titleLabel;

总结

通过这次3GShare的仿写主要让我了解有关协议传值和属性传值的相关用法,以及简单了解了有关通过UITableView来实现一个简单的聊天室的效果。

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

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

相关文章

Day24|二叉树 PART08

235. 二叉搜索树的最近公共祖先 与236类似但可以利用二叉搜索树的性质来做 二叉搜索树&#xff1a;左子 小于头 小于右子 &#xff08;怪怪的 感觉是不是先记住比较好&#xff09;&#xff08;而且也没太理解二叉搜索树的规律&#xff09; 大体思路&#xff1a;从上到下遍历&a…

html 解决tooltip宽度显示和文本任意位置换行文本显示问题

.el-tooltip__popper {max-width: 480px;white-space: break-spaces; /* 尝试不同的white-space属性值 */word-break:break-all; }

干货:three.js中的六大光源的知识点。

我们在二维屏幕中感知三维场景的一个最重要的要素就是光&#xff0c;光和光源是three.js中一个非常重要的知识点。本文想借着这个话题&#xff0c;为老铁们分享以下六大光源知识点&#xff1a;环境光、点光源、聚光灯、方向光、半球光、平面光。 一、点光源 在 Three.js 中&a…

模拟string(四)详解

目录 判断string大小关系bool operator(const string&s1,const string s2)代码 bool operator<(const string& s1, const string& s2)代码 bool operator<(const string& s1, const string& s2)代码 bool operator>(const string& s1, const …

Stable Diffusion WebUI本地环境搭建

一、项目代码下载 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui 二、环境配置 conda create --n stafu python3.10.6 实际上跟自己创建的环境没有关系&#xff0c;项目启动会自动复制这个环境&#xff0c;之后项目根据这个基础环境构建 也可以在自己…

机器学习——第一章 绪论

目录 1. 1 引言 1. 2 基本术语 1.3 假设空间 1.4 归纳偏好 1. 1 引言 机器学习致力于研究如何通过计算的手段&#xff0c;利用经验来玫善系统自身的性能在计算机系统中&#xff0c;"经验"通常以"数据"形式存在&#xff0c;因此&#xff0c;机器学习所研…

由字节对齐引发的一场“血案“

最近在搞个网络通信协议&#xff0c; 采用socket udp传输&#xff0c; 运行时&#xff0c;居然报段错误了&#xff0c; 经过debug&#xff0c;发现居然是因为字节对齐问题导致的。 这个问题在实现通信协议&#xff0c;是经常会遇到的问题&#xff0c; 为了方便读者理解&am…

PSVR2下个月将正式支持PC

PlayStation VR 2将于下个月正式支持PC平台。连接PC&#xff0c;需要使用PlayStation VR2头显PC适配器&#xff0c;该适配器将于8月7日发售。 需要注意的是&#xff0c;玩家还需要一根兼容DisplayPort 1.4的线缆、一个Steam账号以及满足最低配置要求的PC。 索尼特别强调&#…

js 替换json中的转义字符 \

例如有以下字符串 "\"{\\\"account\\\":\\\"66\\\",\\\"name\\\":\\\"66\\\"}\"" 想得到如下字符串 {"account":"66","name":"66"} 执行替换字符串 "\"{…

大坝安全监测设备有哪些主要功能?

推荐型号&#xff1a;TH-WY1】大坝安全监测设备的主要功能包括以下几个方面&#xff1a; 1. **实时监测大坝的各项物理参数**&#xff1a;包括应变、位移、水位、流量等<sup>1</sup><sup>2</sup>。 2. **数据处理和分析**&#xff1a;对监测数据进行处…

热门音效、BGM哪里可以免费下载?

剪辑的奇妙世界等你探索&#xff01;在这个创意的领域里&#xff0c;音效是创造氛围、增强表现力的重要元素。我整理了8个优质的剪辑音效素材网站&#xff0c;它们提供了丰富多样的音效资源&#xff0c;无论是制作视频、音乐还是动画&#xff0c;都能为你提供所需的声音。 1、b…

单关节电机动力学辨识

这是一个单关节电机的动力学辨识过程&#xff0c;这是一个yaw轴转动电机的动力学辨识过程 1、动力学建模 &#xff08;1&#xff09;整体动力学 F J α f F J\alpha f FJαf 单关节的物理量包括惯性项、离心力和科氏力、摩擦力。这里忽略离心力和科氏力&#xff0c;据说…

信息学奥赛初赛天天练-47-CSP-J2020完善程序1-质数、因数、质因数、质因数分解算法、质因数分解算法优化

PDF文档公众号回复关键字:20240727 2020 CSP-J 完善程序1 1 完善程序 (单选题 &#xff0c;每小题3分&#xff0c;共30分) 质因数分解给出正整数 n&#xff0c;请输出将 n 质因数分解的结果&#xff0c;结果从小到大输出 例如&#xff1a;输入 n120&#xff0c;程序应该输出…

mysql报错:Unknown collation: ‘utf8mb4_0900_ai_ci‘的原因及解决方法

参考博客&#xff1a;http://t.csdnimg.cn/NRzyk 报错场景描述 使用navicate在查询中运行sql语句时报错&#xff1a;Unknown collation: utf8mb4_0900_ai_ci 报错原因 生成转储文件的数据库版本为8.0&#xff0c;我本地数据库版本为5.6&#xff0c;高版本导入到低版本&…

【C++】透析类和对象(下)

有不懂的可以翻阅我之前文章&#xff01; 个人主页&#xff1a;CSDN_小八哥向前冲 所属专栏&#xff1a;CSDN_C入门 目录 拷贝构造函数 运算符重载 赋值运算符重载 取地址运算符重载 const成员函数 取地址重载 再探构造函数 初始化列表 类型转换 static成员 友元 内…

【CN】Argo 持续集成和交付(一)

1.简介 Argo 英 [ˈɑ:ɡəu] 美 [ˈɑrˌɡo] Kubernetes 原生工具&#xff0c;用于运行工作流程、管理集群以及正确执行 GitOps。 Argo 于 2020 年 3 月 26 日被 CNCF 接受为孵化成熟度级别&#xff0c;然后于 2022 年 12 月 6 日转移到毕业成熟度级别。 argoproj.github.i…

(最全最小白易懂版)Yolov8新手教程-配置环境、数据集处理、目标检测、结果分析处理(图像指标、可视化结果)、报错分析等全过程学习记录

目录 一、安装环境&#xff08;配置yolo、demo测试&#xff09; 二、数据集准备&#xff08;格式学习&#xff09; 三、训练数据集 1.划分数据集 2.训练数据集 2.1常规训练 2.2微调 3.各种报错记录 3.1AttributeError 3.2TypeError 3.3Error while loading conda en…

Flutter Dio网络请求报错FormatException: Unexpected character

最近开发Flutter项目&#xff0c;网络请求采用的是Dio框架&#xff0c;在发起网络请求的时候报错&#xff1a; 网络请求返回的数据为&#xff1a; var returnCitySN {\"cip\": \"127.0.0.1\", \"cid\": \"00\", \"cname\"…

浅谈 JVM 的内存划分、类加载、垃圾回收机制

文章目录 一、JVM内存划分1.1、JVM为什么要进行内存划分&#xff1f; 二、JVM类加载2.1、什么是类加载&#xff1f;2.2、类加载大体过程2.3、何时触发类加载&#xff1f;2.4、双亲委派模型[!面试高频问题]2.4.1、类加载器2.4.1、什么是双亲委派模型&#xff1f; 三、JVM 垃圾回…

Flink SQL 的工作机制

前言 Flink SQL 引擎的工作流总结如图所示。 从图中可以看出&#xff0c;一段查询 SQL / 使用TableAPI 编写的程序&#xff08;以下简称 TableAPI 代码&#xff09;从输入到编译为可执行的 JobGraph 主要经历如下几个阶段&#xff1a; 将 SQL文本 / TableAPI 代码转化为逻辑执…