基于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:22
    ZJJCountDownTimeStyleNormal = 0,
    //时间戳:1591881249
    ZJJCountDownTimeStyleTamp,
    //时间格式 20170712180622
    ZJJCountDownTimeStylePureNumber
    
};

如何使用

一、使用 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];
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【TS合成MP4】你怎么专打裂开的切片呀

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言TS与MP4格式概述TS与MP4格式概述TS合成MP4的需求背景TS合成MP4的方法概述 合并方法…

【动手学强化学习】01初探强化学习

文章目录 什么是强化学习强化学习解决的问题强化学习的独特性 什么是强化学习 强化学习是机器通过与环境交互来实现目标的计算方法。智能体与环境的交互方式如图所示,在每一轮交互中,智能体根据感知状态经过自身计算给出本轮动作,将其作用于…

C++,STL容器适配器,priority_queue:优先队列深入解析

文章目录 一、容器概览与核心特性核心特性速览二、底层实现原理1. 二叉堆结构2. 容器适配器架构三、核心操作详解1. 容器初始化2. 元素操作接口3. 自定义优先队列四、实战应用场景1. 任务调度系统2. 合并K个有序链表五、性能优化策略1. 底层容器选择2. 批量建堆优化六、注意事项…

duckdb导出Excel和导出CSV速度测试

运行duckdb数据库 D:>duckdb v1.2.0 5f5512b827 Enter “.help” for usage hints. Connected to a transient in-memory database. Use “.open FILENAME” to reopen on a persistent database. 生成模拟数据,10个列,100万行数据; --…

k8s集群离线安装kuberay operator

1,安装方式 采用helm安装方式,首先下载对应的helm chart,这里采用v1.2.2版本,下载地址: https://github.com/ray-project/kuberay-helm/releases/tag/kuberay-operator-1.2.2 2,解压并修改镜像源 由于是在内网环境下搭建&#…

结构形模式---适配器模式

适配器模式是一种结构形模式,主要用于不同在两个互不兼容的类或者库之间增加一个转换。 适配器模式的实现由两种方式,一种是适配器对象,一种是适配器类。 适配器是对象是将第三方接口通过对象调用引入到适配器中。 适配器类是通过多继承将…

面向SDV的在环测试深度解析——概述篇

1.引言 在汽车行业迈向软件定义汽车(SDV)的进程中,传统的硬件在环(HIL)测试方案在面对新的技术架构和需求时逐渐显露出局限性。一方面,现代汽车的电子电气架构日益复杂,高性能计算(…

2025年智慧城市解决方案下载:AI-超脑中台,体系架构整体设计

2025年,随着人工智能、物联网、大数据等新兴技术的深度融合,智慧城市解决方案正迈向更高层次的智能化和协同化阶段。其中,AI-超脑中台作为核心架构的一部分,为城市智能化运行提供了强大支撑。 智慧城市最新解决方案,标…

LINUX常用命令学习

查看系统版本 使用hostnamectl命令检查。hostnamectl显示了CentOS的版本以及操作系统的相关信息,非常方便 设置linux机器别名称 hostnamectl set-hostname 机器别名 --static 华为云 centos 命令:lsb_release -a linux:cat /proc/version 查看进程路…

RK3588 Linux平台部署DeepSeek模型教程

更多内容可以加入Linux系统知识库套餐(教程+视频+答疑) 文章目录 一、下载rknn-llm 和 deepseek模型二、RKLLM-Toolkit 安装2.1 安装 miniforge3 工具2.2 下载 miniforge3 安装包2.3 安装 miniforge3 三、创建 RKLLM-Toolkit Cond…

Azure从0到1

我能用Azure做什么? Azure提供100多种服务,能够从在虚拟机上运行现有应用程序到探索新的软件范式,如智能机器人和混合现实。许多团队开始通过将现有应用程序移动到在Azure中运行的虚拟机(VM)来探索云。将现有应用程序迁移到虚拟机是一个良好的开端,但云不仅仅是运行虚拟…

智慧城市V4系统小程序源码独立版全插件全开源

智慧城市V4系统小程序源码:多城市代理同城信息服务的全域解决方案 在数字化浪潮的推动下,智慧城市已成为全球发展的核心战略。作为这一领域的革新者,智慧城市V4系统小程序源码凭借其多城市代理同城信息服务能力与多商家营销功能,…

JAVA-Lambda表达式(高质量)

要了解Lambda表达式,首先需要了解什么是函数式接口,函数式接口定义:一个接口有且只有一个抽象方法 。 一、函数式接口 1.FunctionalInterger 注意: 1. 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口 2. 如果我们…

机器视觉--Halcon变量的创建与赋值

一、引言 在机器视觉领域,Halcon 作为一款强大且功能丰富的软件库,为开发者提供了广泛的工具和算子来处理各种复杂的视觉任务。而变量作为程序中存储和操作数据的基本单元,在 Halcon 编程中起着至关重要的作用。正确地创建和赋值变量是编写高…

优选驾考小程序

第2章 系统分析 2.1系统使用相关技术分析 2.1.1Java语言介绍 Java语言是一种分布式的简单的 开发语言,有很好的特征,在安全方面、性能方面等。非常适合在Internet环境中使用,也是目前企业级运用中最常用的一个编程语言,具有很大…

ubuntu 22.04 安装vsftpd服务

先决条件,确保你已经配置好了存储库。 安装vsftpd 为了方便实验,我已经切换到了root用户。 rootlocal:~# apt-get install vsftpd修改配置 配置文件在 /etc/vsftpd.conf rootlocal:~# grep -vE ^#|^$ /etc/vsftpd.conf listenNO listen_ipv6YES anonymou…

Uniapp 获取定位详解:从申请Key到实现定位功能

文章目录 前言一、申请定位所需的 Key1.1 注册高德开发者账号1.2 创建应用1.3 添加 Key 二、在 Uniapp 中配置定位功能2.1 引入高德地图 SDK2.2 获取定位权限 三、实现定位功能3.1 使用 uni.getLocation 获取位置3.2 处理定位失败的情况3.3 持续定位3.4 停止持续定位 四、总结 …

MATLAB电机四阶轨迹规划考虑jerk、Djerk

1、内容简介 略 126-可以交流、咨询、答疑 2、内容说明 略 在电机控制中,轨迹规划是一个重要的环节,它决定了电机如何从一个状态平滑地过渡到另一个状态。四阶轨迹规划考虑了位置、速度、加速度和加加速度(jerk),有…

输电杆塔沉降智能监测系统:如何用数据守护电网安全

产品别称:输电线路杆塔沉降在线监测装置、输电线路北斗杆塔沉降在线监测装置、杆塔地基沉降监测设备、输电杆塔沉降智能监测系统 产品型号:TLKS-PMG-BDS 一、产品概述: 在电力传输系统中,输电线路杆塔的稳定性和安全性至关重要。…

Windows搭建SVN本地服务器 + TortoiseSVN客户端

目录 一、SVN服务器搭建 二、TortoiseSVN客户端 一、SVN服务器搭建 注意:例如你已经安装Subversion,要将它卸载,因为VisualSVN会包含Subversion,确保不会发生冲突,可在Windows程序搜索Subversion 卸载它。 Apache…