当前位置: 首页 > news >正文

仿写Timi记账

  • 项目仿照Timi记账,本 APP 仅用作学习,如有侵权联系删除,项目地址:Timi记账

TIMI记账项目

    • 简单功能
      • 对于tableview向上延伸部分采用了insertSubview形式:
      • 添加特殊字体添加.ttf文件
      • 获取plist文件数据
    • 计算器功能
      • 说明
      • 简单逻辑分析
      • 转场效果
    • 添加日历功能
      • 说明
      • 弹窗

简单功能

对于tableview向上延伸部分采用了insertSubview形式:

在tableview上用了insertSubview: atIndex:

 [self.tableView insertSubview:self.topInsertView atIndex:0];

效果:下拉tableview可以看到延伸的topInsertView

添加特殊字体添加.ttf文件

    将.ttf文件拖入项目中在plist文件中添加Fonts provided by application数组在数组下添加一个item将拖入的文件名写入到value记得后缀.ttf(可以手动加.ttf)

获取plist文件数据

    NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"IconImgDic" ofType:@"plist"];NSMutableDictionary *IconDic = [[NSMutableDictionary alloc]initWithContentsOfFile:plistPath];

同样在使用时,利用了model进行处理:

    /**获取plist文件中的图片文字字典**/+ (NSDictionary *)getIconDictionary;/**获取itemmodel数组 **/+ (NSArray<ItemModel *> *)getItemDataSource;

从一个数组获取前20条数据组成一个新的数组:

    NSArray *data = [ItemModel getItemDataSource];self.dataArray = [data subarrayWithRange:NSMakeRange(0, 20)].mutableCopy;

计算器功能

说明

计算器看似简单其实里面各种逻辑很是复杂我在点击自制键盘后根据点击的键位作了很多判断,具体可以查看项目中MyKeyBoardView的.m文件:

简单逻辑分析

1.点击‘+’或‘-’让‘OK’变为‘=’
2.点击‘OK’返回(这里的OK键就是OK键不能是=)
3.点击清零将所有数值归零
4.当进行了一次加减运算后点击‘=’号,计算出结果,这是如果再次点击数字键盘 相当于一次清零,但如果点击的是加减号,将继续保留上次计算结果在此基础上进行二次运算,直至点击清零或者OK。
5.对于小数点的计算也比较复杂,我曾想过用数组的形式将点击的数字保留,以小数点为分割,小数点前为一个数字,后为一个数组,但考虑到当要进行计算时又会增加两个数组,这样定义的数组就会格外的多(虽然现在定义的变量也不少,介于计算后确实需要记录一些数值,但这个量也还是要比数组形式要少上许多),所以后面就没有尝试,而是将一些关键结果保存为字符串,计算时换算为CGFloat进行计算保留两位小数。

转场效果

这里用了第三方控件:HHTransition

添加日历功能

说明

日历功能与计算器差不多,都是看着简单其实都是逻辑别叫复杂,难点在于对NSCalendar的应用,只要能灵活使用NSCalendar想做什么样式的日历都是可以的,这里我使用单例的形式写了一个类,声明的属性是当前日期的一些信息,分别方法写了类方法和实例方法,用哪个都一样,主要获取的信息:

/**用作变量 这些是用作选择时做判断用**/
@property (nonatomic, assign) NSInteger selectYear;
@property (nonatomic, assign) NSInteger selectMonth;
@property (nonatomic, assign) NSInteger selectDay;
/**结束**//**年月日**/
@property (nonatomic, copy) NSString *title;
@property (nonatomic, assign) NSInteger year;
@property (nonatomic, assign) NSInteger month;
@property (nonatomic, assign) NSInteger day;
/**周一是1 周日是0**/
@property (nonatomic, assign) NSInteger weekDay;
/** 当月的天数 */
@property (nonatomic, assign) NSInteger days;
/**上个月总天数**/
@property (nonatomic, assign) NSInteger lastMonthDays;
/**当前年月**/
@property (nonatomic, strong) NSDateFormatter *formatter;/**获取date的下个月日期*/
- (NSDate *)nextMonthDateWithDate:(NSDate *)date;
/** 获取date的上个月日期*/
- (NSDate *)previousMonthDateWithDate:(NSDate *)date;
/**年**/
- (NSInteger)getYearWithDate:(NSDate *)date;
/**月**/
- (NSInteger)getMonthWithDate:(NSDate *)date;
/**日**/
- (NSInteger)getDayWithDate:(NSDate *)date;
/**周几 周一:1 周日为:0**/
- (NSInteger)getWeekDayWithDate:(NSDate *)date;
/**获取该日期的月份的总天数**/
- (NSInteger)getMonthDaysWithDate:(NSDate *)date;+ (NSInteger)getWeekDayWithDate:(NSDate *)date;
/**年-月**/
+ (NSString *)getDateFormatWithDate:(NSDate *)date;
/**日**/
+ (NSInteger)getDayWithDate:(NSDate *)date;
/**月**/
+ (NSInteger)getMonthWithDate:(NSDate *)date;
/**年**/
+ (NSInteger)getYearWithDate:(NSDate *)date;
/**获取该日期的月份的总天数**/
+ (NSInteger)getMonthDaysWithDate:(NSDate *)date;
/**获取date的下个月日期*/
+ (NSDate *)nextMonthDateWithDate:(NSDate *)date;
/** 获取date的上个月日期*/
+ (NSDate *)previousMonthDateWithDate:(NSDate *)date;
/** 获取date的上年日期*/
+ (NSDate *)previousYearDateWithDate:(NSDate *)date;
/**获取date的下一年日期*/
+ (NSDate *)nextYearDateWithDate:(NSDate *)date;
/**将字符串日期转换为date**/
+ (NSDate *)strToDateWithStr:(NSString *)str;

写这些方法主要是根据TiMi这款记账软件,但主要的信息还是获取的差不多。另外提供一种获取日期信息的一种方案记录在QZCalendarModel里,根据achieveCalendarModelWithData获取信息数据,在这个文件里我获取了当月数组,上月数组,以及下月的数组,拼接组成了一个QZCalendarModel的数组(也是主要用作本项目)
QZCalendarModel.m文件大体是这样的:

  @property (nonatomic, copy) NSString *day;/**是当前月**/@property (nonatomic, assign) BOOL isDateMonth;/**是否超过当前日期**/@property (nonatomic, assign) BOOL isOver;@property (nonatomic, assign) BOOL isToday;@property (nonatomic, assign) BOOL isSelected;/**根据日期信息获取日期数组 会有固定42条数据 **/
+ (NSArray<QZCalendarModel *> *)achieveCalendarModelWithData:(NSDate  *)date;

利用collectionview展示出来,每次切换的时候直接给不同的date即可.

弹窗

因为日历是以弹窗的形势存在,所以我将其放在了viewController上设置view.backgroundColor为透明,然后利用present做出了日历的弹窗,之后各位童鞋也可以尝试这种方法,感觉挺灵活的,但对于点击任意半透明区域设置隐藏视图还是碰到了一些问题,因为添加的手势会无差别执行,所以尝试了下面的操作:

- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {//这里试过这两种方法判断 但感觉都不能很好的达到目的所以尝试了下面的point//其一: isMemberOfClass//其二:isKindOfClass//if ([touch.view isKindOfClass:[UITextFieldclass]])//{// return NO;//}CGPoint point = [touch locationInView:self.view];if (point.y > self.view.height - 8 * 40 - SAFEBOTTOMHEIGHT) {return NO;} else {return YES;}}

暂时没做的功能:日历左右上下滑动的动画

相关文章:

仿写Timi记账

项目仿照Timi记账&#xff0c;本 APP 仅用作学习&#xff0c;如有侵权联系删除&#xff0c;项目地址&#xff1a;Timi记账 TIMI记账项目 简单功能对于tableview向上延伸部分采用了insertSubview形式&#xff1a;添加特殊字体添加.ttf文件获取plist文件数据 计算器功能说明简单逻…...

Java语言实现 比较两个Date日期的先后

在 Java 中&#xff0c;可以使用 Date 类的 compareTo() 方法或 before()、after() 方法来比较两个 Date 类型的日期的先后顺序。 使用 compareTo() 方法&#xff1a; Date date1 ...; // 第一个日期 Date date2 ...; // 第二个日期int result date1.compareTo(date2); if (…...

el-table 指定层级展开

先来看看页面默认全部展开时页面的显示效果&#xff1a;所有节点被展开&#xff0c;一眼望去杂乱无章&#xff01; 那么如何实现只展开指定的节点呢&#xff1f;最终效果如下&#xff1a;一眼看去很舒爽。 干货上代码&#xff1a; <el-table border v-if"refreshTabl…...

3288S Android11 适配红外遥控功能(超详细)

目录 一、rk3288平台红外遥控介绍二、原理图分析三、配置设备树并使能红外遥控功能四、打开红外打印功能&#xff0c;查看红外遥控的用户码和键值五、将查看到的红外遥控用户码和键值添加到设备树和.kl文件六、Android红外遥控.kl文件映射知识和使用添加新的.kl文件七、补充&am…...

Linux高性能服务器编程 学习笔记 第三章 TCP协议详解

与IP协议相比&#xff0c;TCP协议更靠近应用层&#xff0c;因此在应用程序中有更强的可操作性。一些重要的socket选项都和TCP协议相关。 本章从以下方面讨论TCP协议&#xff1a; 1.TCP头部信息。TCP头部信息出现在每个TCP报文段中&#xff0c;用于指定通信的源端端口号、目的端…...

【云原生】Kubernetes学习笔记

部署 在部署前强调几点 不要使用IPv6, 很多组件都不支持IPv6不要使用最新版本, 最新版本非常不稳定, 甚至可能存在无法运行的bug不要版本更新, 安装后就将版本固定下来, 新的版本可能会引入新功能, 或移除旧功能, 导致Kubernetes无法运行 Kubeadm介绍 K8s是由多个模块构成的…...

[Machine Learning][Part 2]监督学习的实现

目录 线性模型实现&#xff1a; cost function &#xff1a;代价函数或者损失函数——衡量模型优劣的一个指标 理论&#xff1a; 代码实现: 梯度下降——自动寻找最小的cost function 代价函数 梯度的概念&#xff1a; 梯度下降公式&#xff1a; 实现一个简单的监督学习…...

【计算机毕业设计】基于SpringBoot+Vue大学生心理健康管理系统的开发与实现

博主主页&#xff1a;一季春秋博主简介&#xff1a;专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发&#xff0c;远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容&#xff1a;毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题…...

下载水果FLStudio21.2软件安装更新教程

编曲是一种对音乐创作过程中涉及的元素和步骤进行组织和安排的艺术形式。对于想要学习编曲的人来说&#xff0c;以下是一些有用的建议&#xff1a; 1. 学习基础知识 在开始学习编曲之前&#xff0c;你需要掌握一些基础知识&#xff0c;例如音乐理论、乐器演奏和数字音乐制作技…...

人工智能机器学习-飞桨神经网络与深度学习

飞桨神经网络与深度学习-机器学习 目录 飞桨神经网络与深度学习-机器学习 1.机器学习概述 2.机器学习实践五要素 2.1.数据 2.2.模型 2.3.学习准则 2.4.优化算法 2.5.评估标准 3.实现简单的线性回归模型 3.1.数据集构建 3.2.模型构建 3.3.损失函数 3.4.模型优化 3…...

linux部署页面内容

/bin&#xff1a;该目录包含了常用的二进制可执行文件&#xff0c;如ls、cp、mv、rm等等。 /boot&#xff1a;该目录包含了启动Linux系统所需的文件&#xff0c;如内核文件和引导加载程序。 /dev&#xff1a;该目录包含了所有设备文件&#xff0c;如硬盘、光驱、鼠标、键盘等等…...

若依框架集成WebSocket带用户信息认证

一、WebSocket 基础知识 我们平时前后台请求用的最多的就是 HTTP/1.1协议&#xff0c;它有一个缺陷&#xff0c; 通信只能由客户端发起&#xff0c;如果想要不断获取服务器信息就要不断轮询发出请求&#xff0c;那么如果我们需要服务器状态变化的时候能够主动通知客户端就需要用…...

0基础学习VR全景平台篇 第101篇:企业版功能-子账号分配管理

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 本期为大家带来蛙色VR平台&#xff0c;企业版教程-子账号分配管理功能&#xff01; 功能位置示意 一、本功能将用在哪里&#xff1f; 子账号分配管理功能&#xff0c;主要用于企业版用户为自己服务的终…...

adb 命令集

adb 查看app启动时间 1.清除时间 adb shell am start -S com.android.systemui/.SystemUIService2.启动应用并记录 adb shell am start -W <PACKAGE_NAME>/.<ACTIVITY_NAME>TotalTime: 491 adb 查看分辨率、dpi 分辨率 adb shell wm sizePhysical size: 1080…...

分享78个Python源代码总有一个是你想要的

分享78个Python源代码总有一个是你想要的 源码下载链接&#xff1a;https://pan.baidu.com/s/1ZhXDsVuYsZpOUQIUjHU2ww?pwd8888 提取码&#xff1a;8888 下面是文件的名字。 12个python项目源码 Apache Superset数据探查与可视化平台v2.0.1 API Star工具箱v0.7.2 Archery…...

springcloud3 指定nacos的服务名称和配置文件的group,名称空间

一 指定读取微服务的配置文件 1.1 工程结构 1.2 nacos的配置 1.配置文件 2.内容 1.3 微服务的配置文件 1.bootstrap.yml内容 2.application.yml文件内容 1.4 验证访问 控制台&#xff1a; 1.5 nacos服务空间名称和groupid配置 1.配置文件配置 2.nacos的查看...

go-redis简单使用

目录 一&#xff1a;官方文档和安装方式二&#xff1a;简单案例使用 一&#xff1a;官方文档和安装方式 官方中文文档&#xff1a;https://redis.uptrace.dev/zh/guide/go-redis.html安装&#xff1a;go get github.com/redis/go-redis/v9 二&#xff1a;简单案例使用 简单的…...

33. 搜索旋转排序数组-二重二分查找

33. 搜索旋转排序数组-二分查找 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, n…...

mysql自动删除过期的binlog

一、binlog_expire_logs_seconds 配置项 mysql 8.0使用配置项 binlog_expire_logs_seconds 设置binlog过期时间&#xff0c;单位为秒。 mysql旧版本使用配置项 expire_logs_days 设置binlog过期时间&#xff0c;单位为天&#xff0c;不方便测试。 在 8.0 使用 expire_logs_d…...

Java面向对象(1)

static静态变量 public class Student {static String name;private double score;public Student(){};public Student(double score) {this.score score;}public double getScore() {return score;}public void setScore(double score) {this.score score;} }public class t…...

【计算机毕业设计】基于SpringBoot+Vue金融产品销售系统的设计与实现

博主主页&#xff1a;一季春秋博主简介&#xff1a;专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发&#xff0c;远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容&#xff1a;毕业设计(Java项目、小程序、安卓等)、简历模板、学习资料、…...

【面试题精讲】Mysql如何实现乐观锁

❝ 有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top ❞ 首发博客地址 文章更新计划 系列文章地址 在 MySQL 中&#xff0c;可以通过使用乐观锁来实现并发控制&#xff0c;以避免数据冲突和并发更新问…...

从零开始搭建java web springboot Eclipse MyBatis jsp mysql开发环境

文章目录 1 第一步软件安装1.1 下载并安装Eclipse1.2 下载并安装Java1.3 下载并安装Apache Maven1.4 下载并安装MySQL 2 创建所需要的表和数据3 创建Maven 工程、修改jdk4 通过pom.xml获取所需要的jar包5 安装Eclipse的MyBatis插件6 创建文件夹以及jsp文件7 创建下面各种java类…...

【VsCode】整理代码

在VsCode中&#xff0c;你可以使用插件"Beautify"来格式化你的HTML代码&#xff0c;使其更加整齐清晰。而对于JSON代码&#xff0c;你可以使用"vscode-json"插件来格式化为易读的树状结构&#xff0c;方便查看和编辑。这些插件可以帮助你更加高效地整理HTM…...

盘点总结汇总植物病虫害、人体疾病识别相关的项目实践

在前面的很多项目中做了许多有关于植物病虫害比如&#xff1a;苹果病虫害、番茄病虫害、小麦病虫害、辣椒病虫害、白菜病虫害、木薯病虫害、葡萄病虫害、柑橘病虫害等等&#xff0c;还有一些是有关于人体疾病识别相关的&#xff0c;比如&#xff1a;病理细胞识别、癌症识别、皮…...

【测试开发】用例篇 · 熟悉黑盒测试用例设计方法(2)· 正交表 · 场景设计 · 常见案例练习

【测试开发】用例篇&#xff08;2&#xff09; 文章目录 【测试开发】用例篇&#xff08;2&#xff09;1. 正交表法1.1 什么是正交表1.2 两个重要概念1.3 如何通过正交表设计测试用例1.3.1 充分理解需求1.3.2 确定因素、确定水平1.3.3 allpairs画正交表1.3.4 补充正交表1.3.5 将…...

【ES】笔记-数值扩展

数值扩展 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>数值扩展</title> </head> &l…...

浅谈Rust内存管理

Rust因在内存管理上的独到之处&#xff0c;近年来受到了不少开发者的青睐。Rust内存管理的核心功能就是所有权。不同的语言采取了不同的内存管理方式&#xff0c;主要分为开发者手动管理或者编译器辅助管理&#xff0c;以及垃圾回收机制等。Rust的所有权机制&#xff0c;有别于…...

Vue路由跳转至页面后多次渲染

在 Vue 中&#xff0c;当你跳转到一个新的路由或者重新加载当前路由时&#xff0c;由于 Vue Router 或其他路由管理工具的机制&#xff0c;会导致该页面组件重新渲染多次的情况发生。这可能是因为以下原因&#xff1a; 组件复用&#xff1a;Vue Router 默认情况下会尝试复用已经…...

CDH大数据平台集群部署

文章目录 1. 资源准备2. 部署 Mariadb 数据库3. 安装CM服务4. 安装数据节点5. 登录CM系统 1. 资源准备 准备好CDH安装包资源&#xff0c;官方网站下载需要账号&#xff0c;如果没有账号可以去网上到处搜搜。主要涉及到的资源有&#xff1a; cloudera-manager-servercloudera-m…...

玉环市建设工程检测中心网站/嘉兴网站建设方案优化

在博客设置中&#xff0c; 使用如下信息 于是用上图中的链接创建新用户&#xff0c; 密码和用户名和之前的一样 注册成功 并且发布成功转载于:https://www.cnblogs.com/kexinxin/p/10147122.html...

wordpress qq分享插件/搜索引擎关键词优化技巧

HashMap为什么会是面试中的常客呢&#xff1f;我觉得有以下几点原因&#xff1a;* 考察你阅读源码的能力* 是否了解内部数据结构* 是否了解其存储和查询逻辑* 对非线程安全情况下的使用考虑 前段时间一同事面试蚂蚁金服&#xff0c;就被问到了这个问题&#xff1b;其实很多情况…...

问卷调查网站JAVA怎么做/建设网站公司

1415. [NOIP2001]数的计数 ☆ 输入文件&#xff1a;nums.in 输出文件&#xff1a;nums.out 简单对比 时间限制&#xff1a;1 s 内存限制&#xff1a;256 MB 【题目描述】 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n≤1000)&#xff0c…...

网站建设lieyanma/盐城seo营销

北京中科瑞祺科技有限责任公司为您详细解读fzmSXi绍兴山特UPS电源多少钱的相关知识与详情&#xff0c;不连续电源(UPS)是将蓄电池(多为铅酸免维护蓄电池)取主机相连接&#xff0c;通过主机逆变器等模块电路将曲流电转换成市电的系统机械工具。它首先用于给单台计较机、计较机网…...

安乡网站制作/免费b站推广短视频

大家多多少少应该都会对红帽公司有些了解&#xff0c;我们发现&#xff0c;现在越来越多的人想要通过红帽认证考试来提升个人价值&#xff0c;但也有一部分人对红帽认证不了解&#xff0c;正在犹豫是否要参加红帽考试&#xff0c;不知道红帽认证含金量如何。下面腾科教育小编就…...

五种类型网站/有哪些推广平台和渠道

运行车辆追踪处理流水线1 说明2 实验目的3 任务内容4 实验原理5 操作步骤6 实际操作1 说明 本实验所有代码均在ubuntu 18.04 OpenVINO 2020R3.LTS installed 环境下验证通过&#xff0c;若需要代码移植&#xff0c;请务必检查环境配置是否与本实验环境相同。 2 实验目的 1、…...