基于IOS实现各种倒计时功能
ZJJTimeCountDown
效果图

特点:
1、已封装,支持自定义
2、支持文本各种对齐模式
3、各种效果都可以通过设置 ZJJTimeCountDownLabel 类属性来实现
4、支持背景图片设置
5、分文本显示时间时,支持设置文字大小,来动态设置每个文本宽度
6、动态的每个 Cell 中可支持多个倒计时
7、实现验证码倒计时,只需要调用两个方法就可以
支持 pod 导入
pod 'ZJJTimeCountDown', '~> 1.0.3'
使用注意事项:
1、显示倒计时的 label 要使用 ZJJTimeCountDownLabel 类或者继承 ZJJTimeCountDownLabel 类
2、要在使用 label 前设置 label 属性,动态 Cell 上使用一定要设置 timeKey 属性值,非动态 Cell 上使用不需要设置 timeKey 属性值,因为内部实现已经设置好
3、在动态的 UITableViewCell 或 UICollectionViewCell 上使用倒计时 label,需要调用以下两个方法
- (void)setupCellWithModel:(id)model indexPath:(NSIndexPath *)indexPath;- (NSAttributedString *)countDownWithModel:(id)model timeLabel:(ZJJTimeCountDownLabel *)timeLabel;
4、设置 textAdjustsWidthToFitFont 属性值为 YES,要确保 label 宽度够长
ZJJTimeCountDownLabel 支持对齐方式
//文本对齐方式
typedef NS_ENUM(NSInteger ,ZJJTextAlignmentStlye){ZJJTextAlignmentStlyeLeftCenter = 0,ZJJTextAlignmentStlyeLeftTop,ZJJTextAlignmentStlyeLeftBottom,ZJJTextAlignmentStlyeCenterTop,ZJJTextAlignmentStlyeCenter,ZJJTextAlignmentStlyeCenterBottom,ZJJTextAlignmentStlyeRightTop,ZJJTextAlignmentStlyeCenterRight,ZJJTextAlignmentStlyeRightBottom,//自定义位置,配合textLeftDeviation和textTopDeviation属性值来使用ZJJTextAlignmentStlyeCustom,//水平居中,配合textLeftDeviation属性值来使用ZJJTextAlignmentStlyeHorizontalCenter,//垂直居中 配合textTopDeviation属性值来使用ZJJTextAlignmentStlyeVerticalCenter,};
ZJJTimeCountDown 支持时间格式:
typedef NS_ENUM(NSInteger , ZJJCountDownTimeStyle) {//时间格式:2017-7-12 18:06:22ZJJCountDownTimeStyleNormal = 0,//时间戳:1591881249ZJJCountDownTimeStyleTamp,//时间格式 20170712180622ZJJCountDownTimeStylePureNumber};
如何使用
一、使用 ZJJTimeCountDownLabel 类或继承 ZJJTimeCountDownLabel 类来创建倒计时 label , 并在初始化视图时设置 label 属性,动态 Cell 上的 label 的 timeKey 属性一定要设置,推荐以下三种设置方式
1)、如果是使用继承 ZJJTimeCountDownLabel 类,在该类的.m 文件中重写以下方法
- (void)setupProperty{//对应模型中要显示的倒计时的属性字符串(动态Cell中,必须要设置timeKey)self.timeKey = @"endTime";//边框模式self.textStyle = ZJJTextStlyeDDHHMMSSBox;//居中对齐self.jj_textAlignment = ZJJTextAlignmentStlyeCenter;//设置过时数据自动删除self.isAutomaticallyDeleted = YES;
}
2)、直接使用 ZJJTimeCountDownLabel 类,如果非 xib 形式,初始化时进行设置
self.timeLabel = [[ZJJTimeCountDownLabel alloc] init];//对应模型中要显示的倒计时的属性字符串(动态Cell中,必须要设置timeKey)self.timeLabel.timeKey = @"endTime";//边框模式self.timeLabel.textStyle = ZJJTextStlyeDDHHMMSSBox;//居中对齐self.timeLabel.jj_textAlignment = ZJJTextAlignmentStlyeCenter;//过时后,显示的文字self.timeLabel.jj_description = @"活动结束了!";
3)、直接使用 ZJJTimeCountDownLabel 类,如果是 xib 形式,在 ZJJTimeCountDownLabel 的父视图初始化时设置
- (void)awakeFromNib {[super awakeFromNib];//对应模型中要显示的倒计时的属性字符串(动态Cell中,必须要设置timeKey)self.timeLabel.timeKey = @"endTime";//居中对齐self.timeLabel.jj_textAlignment = ZJJTextAlignmentStlyeCenter;//过时后,显示的文字self.timeLabel.jj_description = @"活动结束了!";
}
二、创建 ZJJTimeCountDown 对象,不同的使用场景,创建 ZJJTimeCountDown 对象的方法也有所不同,以下两种使用场景
1、在动态的 UITableViewCell 或 UICollectionViewCell 上使用
1)、创建 JJTimeCountDown 对象的方法
_countDown = [[ZJJTimeCountDown alloc] initWithScrollView:self.tableView dataList:self.dataList];
2)、在代理方法中设置 label 的 indexPath 和 attributedText 属性
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {static NSString *cellID = @"cellID";ZJJTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];if (cell == nil) {cell = [[ZJJTableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellID];}TimeModel *model = self.dataList[indexPath.row];//一定要设置,设置时间数据[cell.timeLabel setupCellWithModel:model indexPath:indexPath];//在不设置为过时自动删除情况下 设置该方法后,滑动过快的时候时间不会闪情况cell.timeLabel.attributedText = [self.countDown countDownWithTimeLabel:cell.timeLabel];return cell;
}
3)、在 Cell 的区头或区尾上使用,返回的区头或区尾视图代理方法中,要先调用以下方法,对视图进行处理
- (UIView *)dealWithHeaderView:(UIView *)view viewForHeaderInSection:(NSInteger)section;- (UIView *)dealWithFooterView:(UIView *)view viewForFooterInSection:(NSInteger)section;
2 非动态的 UITableViewCell 或 UICollectionViewCell 上使用
1)创建 JJTimeCountDown 对象并添加 label
_countDown = [[ZJJTimeCountDown alloc] init];//时间格式为时间戳_countDown.timeStyle = ZJJCountDownTimeStyleTamp;//设置代理_countDown.delegate = self;//添加数据, time:时间戳[_countDown addTimeLabel:self.timeLabel time:@"1591881249"];
三、ZJJTimeCountDown 代理方法
/**过时的数据自动删除回调方法, 针对UITableView 或者 UICollectionView上的倒计时视图@param model 数据模型*/
- (void)scrollViewWithAutomaticallyDeleteModel:(id)model;
/**过时的数据回调方法,回调的数据调用addTimeLabel:(ZJJTimeCountDownLabel *)timeLabel time:(NSString *)time方法所添加数据@param timeLabel 倒计时视图@param timeCountDown self*/
- (void)outDateTimeLabel:(ZJJTimeCountDownLabel *)timeLabel timeCountDown:(ZJJTimeCountDown *)timeCountDown;/**每次执行倒计时,回调方法@param timeLabel 倒计时Label@param timeCountDown self*/
- (void)dateWithTimeLabel:(ZJJTimeCountDownLabel *)timeLabel timeCountDown:(ZJJTimeCountDown *)timeCountDown;/**自定义时间格式方法 ,需要设置timeLabel的textStyle为ZJJTextStlyeCustom,自定义时间样式才会生效如果返回值为nil或者@“”,自定义时间格式失败,失败后显示原来时间格式@param timeLabel 时间label@param timeCountDown self@return 自定义时间格式字符*/
- (NSAttributedString *)customTextWithTimeLabel:(ZJJTimeCountDownLabel *)timeLabel timeCountDown:(ZJJTimeCountDown *)timeCountDown;
四、销毁定时器
- (void)dealloc{[self.countDown destoryTimer];
}相关文章:
基于IOS实现各种倒计时功能
ZJJTimeCountDown 效果图 特点: 1、已封装,支持自定义 2、支持文本各种对齐模式 3、各种效果都可以通过设置 ZJJTimeCountDownLabel 类属性来实现 4、支持背景图片设置 5、分文本显示时间时,支持设置文字大小,来动态设置每个文本…...
Linux(Centos 7.6)命令详解:head
1.命令作用 将每个文件的前10行打印到标准输出(Print the first 10 lines of each FILE to standard output) 2.命令语法 Usage: head [OPTION]... [FILE]... 3.参数详解 OPTION: -c, --bytes[-]K,打印每个文件的前K字节-n, --lines[-],打印前K行而…...
微软 Microsoft Windows Office Professional LTSC 2024 专业增强版
Office 链接:https://pan.xunlei.com/s/VOIyE3ALg0hDvQfj47cLf3MdA1?pwdvzuz#...
【愚公系列】《Python网络爬虫从入门到精通》009-使用match()进行匹配
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...
Spring Boot 3 集成Xxl-job 3.0.0 单机
下载Xxl-job项目 https://gitee.com/xuxueli0323/xxl-jobhttps://github.com/xuxueli/xxl-job 创建相关数据库 数据库文件再/xxl-job/doc/db/tables_xxl_job.sql直接在数据库中运行SQL文件即可创建相关数据库 配置调度中心 打开项目找到 xxl-job-admin模块找到/xxl-job/xx…...
DeepSeek自动批量写作的AI软件
DeepSeek作为一款专注于数据处理与分析的AI软件,凭借其强大的功能和精准的分析能力,正在帮助企业实现智能化升级。无论是数据分析、市场预测还是内容创作,DeepSeek都能提供高效的解决方案。 无法使用Deepseek批量创作文案的,可在1…...
NLLB 与 ChatGPT 双向优化:探索翻译模型与语言模型在小语种应用的融合策略
作者:来自 vivo 互联网算法团队- Huang Minghui 本文探讨了 NLLB 翻译模型与 ChatGPT 在小语种应用中的双向优化策略。首先介绍了 NLLB-200 的背景、数据、分词器和模型,以及其与 LLM(Large Language Model)的异同和协同关系。接着…...
OpenCV机器学习(4)k-近邻算法(k-Nearest Neighbors, KNN)cv::ml::KNearest类
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::ml::KNearest 是 OpenCV 机器学习模块中的一部分,它提供了实现 k-近邻算法(k-Nearest Neighbors, KNN)的…...
在nodejs中使用RabbitMQ(三)Routing、Topics、Headers
示例一、Routing exchange类型direct,根据消息的routekey将消息直接转发到指定队列。producer.ts 生产者主要发送消息,consumer.ts负责接收消息,同时也都可以创建exchange交换机,创建队列,为队列绑定exchangeÿ…...
浏览器扩展实现网址自动替换
作为一个开发爱好者,不能顺畅访问github是很痛苦的,这种状况不知道何时能彻底解决。 目前也有很多方案可以对应这种囧况,我此前知道有一个网站kkgithub,基本上把github的静态内容都搬了过来,我们如果需要访问某个githu…...
《open3d qt 网格泊松采样成点云》
open3d qt 网格泊松采样成点云 效果展示二、流程三、代码效果展示 效果好一点,速度慢一点。 二、流程 创建动作,链接到槽函数,并把动作放置菜单栏 参照前文 三、代码 1、槽函数实现 void on_actionMeshPossionSample_triggered()//泊松采样 void MainWindow::...
从算法到落地:DeepSeek如何突破AI工具的同质化竞争困局
🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 Linux网络编程笔记: https://blog.cs…...
阿里云一键部署DeepSeek-V3、DeepSeek-R1模型
目录 支持的模型列表 模型部署 模型调用 WebUI使用 在线调试 API调用 关于成本 FAQ 点击部署后服务长时间等待 服务部署成功后,调用API返回404 请求太长导致EAS网关超时 部署完成后,如何在EAS的在线调试页面调试 模型部署之后没有“联网搜索…...
python学opencv|读取图像(六十六)使用cv2.minEnclosingCircle函数实现图像轮廓圆形标注
【1】引言 前序学习过程中,已经掌握了使用cv2.boundingRect()函数实现图像轮廓矩形标注,相关文章链接为:python学opencv|读取图像(六十五)使用cv2.boundingRect()函数实现图像轮廓矩形标注-CSDN博客 这篇文章成功在图…...
嵌入式经常用到串口,如何判断串口数据接收完成?
说起通信,首先想到的肯定是串口,日常中232和485的使用比比皆是,数据的发送、接收是串口通信最基础的内容。这篇文章主要讨论串口接收数据的断帧操作。 空闲中断断帧 一些mcu(如:stm32f103)在出厂时就已经在…...
面试真题 | B站C++渲染引擎
一、基础与语法 自我介绍 请简要介绍自己的背景、专业技能和工作经验。实习介绍 详细描述你在实习期间参与的项目、职责和成果。二、智能指针相关问题回答 unique_ptr 是如何实现的?它有哪些特点和优势? unique_ptr 是C++11引入的一种智能指针,用于管理动态分配的内存资源…...
系统不是基于UEFI的win11,硬盘格式MBR,我如何更改为GPT模式添加UEFI启动?
我的系统不是基于UEFI的win11,硬盘格式MBR,我如何更改为GPT模式添加UEFI启动? 相当于你的Windows 11系统从MBR转换为GPT,并添加UEFI启动支持,你需要执行以下步骤: 备份数据 首先,强烈建议你备份…...
Vue2/Vue3分别如何使用computed
computed 是 Vue 中用于定义计算属性的功能,它会根据依赖的数据动态计算并缓存结果。Vue 2 和 Vue 3 中的 computed 使用方式有所不同,以下是详细说明: Vue2中的computed 在 Vue 2 中,computed 是通过选项式 API 实现的ÿ…...
操作系统知识速记:实现线程同步的方式
操作系统知识速记:实现线程同步的方式 在当今的多核和多线程世界里,线程同步是确保数据一致性和提高系统性能的关键。 互斥锁(Mutex) 互斥锁是实现线程安全的基础。它通过确保同一时间只有一个线程能访问共享资源来防止数据竞争。…...
用vue3写一个好看的wiki前端页面
以下是一个使用 Vue 3 Element Plus 实现的 Wiki 风格前端页面示例,包含现代设计、响应式布局和常用功能: <template><div class"wiki-container"><!-- 头部导航 --><el-header class"wiki-header"><d…...
从图像中提取的每行数字作为一张完整的图片,而不是每个数字单独成为一张图片
具体实现思路: 提取行区域:先通过轮廓或空白区域分割出每行数字。确保每行是一个整体:在提取每行时,确保提取区域的宽度包含该行所有的数字(即避免单独分割每个数字)。保存每一行作为一张图片:…...
【Elasticsearch】通过运行时字段在查询阶段动态覆盖索引字段
在 Elasticsearch 中,Override field values at query time是指通过运行时字段(runtime fields)在查询阶段动态覆盖索引字段的值,而无需修改原始索引数据。这种功能特别适用于以下场景: 1. 动态修改字段值:…...
文心一言4月起全面免费,6月底开源新模型:AI竞争进入新阶段?
名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼 Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、文心一言免费化的背后:AI成本与应用的双重驱动1️⃣成本下降,推动文心一言普及2…...
基于斜坡单元的机器学习模型预测滑坡易发性,考虑条件因素的异质性
1、引用 Chang Z, Catani F, Huang F, et al. Landslide susceptibility prediction using slope unit-based machine learning models considering the heterogeneity of conditioning factors[J]. Journal of Rock Mechanics and Geotechnical Engineering, 2023…...
面向对象程序设计-实验七
6-1 计算捐款总量 这里需要设计一个捐款人类Donator及一个相关函数getMaxName( ),Donator类中包含捐款人的姓名及其捐款额 代码清单: #include <iostream> using namespace std; class Donator { private: string name; float money; //单位&…...
如何学习Elasticsearch(ES):从入门到精通的完整指南
如何学习Elasticsearch(ES):从入门到精通的完整指南 嘿,小伙伴们!如果你对大数据搜索和分析感兴趣,并且想要掌握Elasticsearch这一强大的分布式搜索引擎,那么你来对地方了!本文将为…...
Java面试宝典:说下Spring Bean的生命周期?
Java面试宝典专栏范围:JAVA基础,面向对象编程(OOP),异常处理,集合框架,Java I/O,多线程编程,设计模式,网络编程,框架和工具等全方位面试题详解 每…...
early bird inject
基本原理 本质是利用windows系统的apc机制,以及涉及到windows进程启动的流程. 因为线程初始化阶段LdrInitializeThunk函数会调用NtTestAlert函数,这个函数执行后,所有apc队列中的例程都会执行.因此我们在主线程初始化之前向主线程的apc队列中加入恶意代码即可实现…...
Spring Boot 的约定优于配置:简化开发的艺术
# Spring Boot 的约定优于配置:简化开发的艺术 在现代软件开发中,Spring Boot 凭借其“约定优于配置”(Convention Over Configuration,简称 CoC)的理念,极大地简化了 Spring 应用的开发流程。本文将深入探…...
WSL Ubuntu 安装 CUDA 教程
WSL Ubuntu 安装 CUDA 教程 1. 概述2. 准备工作3. 删除旧的 GPG 密钥4. 安装 CUDA Toolkit4.1 使用 WSL-Ubuntu 包安装(推荐) 5. 设置环境变量6. 注意事项7. 参考链接8. 总结 1. 概述 随着 WSL 2 的推出,Windows 用户现在可以在 Windows 子系…...
