带刻度尺的日期选择器

2023-10-27

写在前面的话:最近产品要求做个需求,比较奇葩,选择时间的,本来原生的UIDatePickerView很好用,可是产品非要搞成这个样子:

PicturePreview.png

这样一来就只能自定义了,谁叫程序员不擅长拒绝呢,以下是实现这个页面的一些记录,需要的话文章末尾也有源码,欢迎收藏、star…


版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hongyangcao/article/details/102854331

1.概述

这个功能是选择日期的,上部显示的是一个刻度尺,可以左右拖动,可选择全年的日期,选中后下方的按钮会显示出选中的月份和年;点击下方的按钮后会弹出时间选择器,可选择任意时间,选中后也会反显对应的月份和年,上部的刻度尺也会滚动到对应的位置,预览如下:

20191029Preview.gif

2.试着使用UIPickerView实现

刚拿到这个任务的时候,也是百度、Github一顿找,没找到有类似的控件(这么说来产品还比较优秀),没办法只能自己手敲了。这个刻度尺的实现是个难点,有点像UIPickerView,但是又是横过来的。那就先写好竖着的刻度尺然后旋转一下,开干,实现以后发现旋转页面会变形,刻度尺也是弯着的,这个思路也就终结了。

3.使用UICollectionView实现

那就使用UICollectionView实现吧,自定义Cell,增加Label,刻度尺用贝塞尔曲线画出来,这些都比较容易实现,就不贴代码了。
个人认为实现这个刻度尺的关键点:

1.获取一年12个月的数据:

+ (NSMutableArray *)getAllDaysWith:(NSDate *)date {
    NSString *year = [self getYearWith:date];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd"];
    //设置转换后的目标日期时区
    NSTimeZone *toTimeZone = [NSTimeZone defaultTimeZone];
    //转换后源日期与世界标准时间的偏移量
    NSInteger toGMTOffset = [toTimeZone secondsFromGMTForDate:[NSDate date]];
    [dateFormatter setTimeZone: [NSTimeZone timeZoneForSecondsFromGMT:toGMTOffset]];
    NSMutableArray *array = [NSMutableArray arrayWithCapacity:12];
    for (int i = 1; i < 13; i++) {
        NSString *firstDay = [year stringByAppendingFormat:@"-%02d-01", i];
        NSDate *date = [dateFormatter dateFromString:firstDay];
        NSInteger days = [self getMonthNumberDaysWithDate:date];
        NSMutableArray *daysArray = [NSMutableArray arrayWithCapacity:days];
        for (int j = 1; j <= days; j++) {
            [daysArray addObject:[NSString stringWithFormat:@"%02d", j]];
        }
        array[i-1] = daysArray;
    }
    return array;
}

该方法返回二维数组,可直接显示每个月的每一天。

2.滚动到1月1号和12月31号的时候如何能够无缝的显示?

想着和无限轮播图一样实现,但这个cell又不是整屏显示的,根本没办法实现。
后台也是在网上受到的启发,直接更改数据源,我只显示一年12个月的时间,因此我直接把数据改为36个月,我显示的时候只显示中间12个月的时间,这样就能够顺滑的显示。
^^正常应该没人会手动滑365个cell看我的边界吧 ^^
如果有大神知道更好的方法,希望能给我留言,万分感谢!!!

- (void)setSelectedIndexPath:(NSIndexPath *)selectedIndexPath {
    /// 选中数据后放到中间组显示
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:selectedIndexPath.row inSection:selectedIndexPath.section+12];
    [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:(UICollectionViewScrollPositionCenteredHorizontally) animated:YES];
}

- (void)setDataArray:(NSArray *)dataArray {
    /// 创建三组数据,避免边界值不能选择的问题
    NSMutableArray *mutableArray = dataArray.mutableCopy;
    [mutableArray addObjectsFromArray:dataArray];
    [mutableArray addObjectsFromArray:dataArray];
    _dataArray = mutableArray.copy;
    [self.collectionView reloadData];
}

4. 模糊&渐变

这也是比较常规代码,就不赘述了,直接上代码:

/// 增加模糊效果
    CGFloat space = 10;
    CGFloat widthRatio = 0.15;
    CGFloat viewHeight = self.frame.size.height - space;
    UIBlurEffect *effect = [UIBlurEffect effectWithStyle:(UIBlurEffectStyleExtraLight)];
    UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:effect];
    effectView.alpha = 0.5;
    effectView.frame = CGRectMake(self.collectionView.frame.origin.x, self.collectionView.frame.origin.y + space, self.frame.size.width * widthRatio, viewHeight);
    [self addSubview:effectView];

/// 增加渐变效果
    UIColor *color = [UIColor lightGrayColor];
    CAGradientLayer *viewALayer = [CAGradientLayer layer];
    viewALayer.frame = effectView1.bounds;
    viewALayer.colors = [NSArray arrayWithObjects:
                       (id)[UIColor whiteColor].CGColor,
                       (id)color.CGColor, nil];
    viewALayer.startPoint = CGPointMake(0, 0);
    viewALayer.endPoint = CGPointMake(1, 0);
    [effectView1.layer addSublayer: viewALayer];

Demo地址

tips: 使用Xcode 11创建的项目,如果使用低版本的Xcode运行可能会报错。
实现的过程比较曲折和匆忙,如有bug请留言反馈,谢谢。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带刻度尺的日期选择器 的相关文章

  • 组成原理---控制器

    文章目录 控制器的组成及指令的执行 基本的计算机组成和功能 控制器的组成 时序及控制方式 数据通路和指令的执行过程 简单计算机系统主机各部件的实现方案 简单计算机系统中指令的执行过程 MIPS单周期CPU的数据通路和指令的执行过程 硬布线控
  • 机器学习实战——6.支持向量机

    目录 6 1 基于最大间隔分隔数据 6 2 寻找最大间隔 6 2 1 分类器求解的优化问题 6 2 2 SVM应用的一般框架 6 3 SMO高效优化算法 6 3 1 Platt的SMO算法 6 3 2 应用简化版SMO算法处理小规模数据集
  • springboot 全局异常处理类

    目录标题 springboot 全局异常处理类 依赖 代码 springboot 全局异常处理类 依赖
  • 在CocosCreator的3.x版本中实现贝塞尔曲线

    使用环境参考 CocosCreator v3 7 3 前情提要 在之前的 2 x 版本中 CocosCreator 关于贝塞尔曲线是内置了 API 可以让节点动画直接使用 但在升级到 tween 实现后 灵活了但没有了现成的贝塞尔曲线的实现
  • 2020年高教社杯全国大学生数学建模竞赛---校园供水系统智能管理(Python代码实现)

    目录 1 概述 2 问题 3 运行结果 4 Python代码 1 概述 校园供水系统是校园公用设施的重要组成部分 学校为了保障校园供水系统的正常运行需要投入大量的人力 物力和财力 随着科学技术的发展 校园内已经普遍使用了智能水表 从而可以获
  • 用geoda软件进行空间自相关分析示例

    毕业论文需要用到空间自相关 所以摸索摸索了好久 终于弄出了大概的流程了 情景1 如果你没有shp格式的文件数据 那么我建议你下载geoda095i这个版本 因为最新版本的我不太会操作 明确问题 假如我们要对广东省各市2005人均GDP进行空
  • 算法设计与分析 期末考试试卷

    1 渐进表示法中f n O g n 意味着f n 的数量级 不大于 g n 的数量级 填 小于 大于 不小于 或 不大于 平时各种教材中见到的O n2 表达的意思是算法的复杂度 等于 n2数量级 填 小于 等于 或 大于 2 算法的正确性通
  • 【C语言】超详细的移位、位操作符详解(含力扣实战)

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 1 整数的二进制表示 2 移位操作符 2 1左移操作符 低
  • 第086讲: Pygame:碰撞检测

    今天我们来学习碰撞检测 大部分游戏都是需要做碰撞检测的 因为你需要知道小球是否发生了碰撞 子弹是否击中了目标 主角是否踩到了狗屎 那应该如何实现呢 说白了 它这个原理很简单 就是检测两个精灵之间是否存在重叠的部分 像我们上节课的小球 在图1
  • innodb_flush_method理解(图解)

    innodb flush method这个参数控制着innodb数据文件及redo log的打开 刷写模式 对于这个参数 文档上是这样描述的 有三个值 fdatasync 默认 O DSYNC O DIRECT 默认是fdatasync 调
  • wsl2 出现 Vmmem内存占用过大问题解决

    分步解决方法 定期执行缓存删除 在WSL bash上 执行 sudo crontab e u root 并添加以下行 15 sync echo 3 gt proc sys vm drop caches touch root drop cac
  • AD常用DRC规则简单介绍

    前言 最近在复习AD中画PCB板时的DRC规则 在这里做一个常用规则的简单总结 虽然有时候可以无脑将除电气规则以外的其他规则全部取消勾选 但是这样并不好 正文 Electrical Clearance Constraint 走线的线路间隔
  • Cannot construct instance of `com.baomidou.mybatisplus.core.metadata.IPage

    Feign调用无法解析 IPage包裹的数据 目前解决方案有两种 一种是转Page 另一种是序列化 一 转Page传递 api接口 PostMapping value queryEnterprise public Result
  • Mysql基础(入门)

    一 数据库介绍 1 什么是数据库 数据库就是 个存放计算机数据的仓库 这个仓库是按照 定的数据结构 数据结构是指数据的组织形式或数据之间的联系 来对数据进 组织和存储的 可以通过数据库提供的多种 法来管理其中的数据 2 数据库的种类 最常
  • cuda的Shuffle技术以及自定义双精度版本

    还是数组求和问题引起的 发现之前那个版本http blog csdn net lingerlanlan article details 24630511 对于数组的维度是有要求的 因为归约每次变为一半 所以对于线程块的数量和每个线程块线程的
  • Git:Git的一些基本操作

    文章目录 基本认识 使用方法 创建本地仓库 配置本地仓库 工作区 暂存区 版本库的概念 添加文件 版本回退 撤销修改 删除操作 基本认识 首先要对Git有一个基本的认知 Git本质上是一个版本控制器 可以对一个信息的多个版本进行一些控制 而
  • 《canvas》之第19章 canvas游戏开发

    canvas 之第19章 canvas游戏开发 第19章 canvas游戏开发 19 1 canvas游戏开发简介 19 2 Box2D简介 19 2 1 Box2D 19 2 2 Box2DWeb 19 3 html5游戏引擎 第19章

随机推荐

  • Java:SimpleDateFormat解析过程中的时区问题

    在做分布式系统开发的过程中 笔者遇到了集群中各成员显示时间数据不一致的问题 排查发现是因各个成员的系统时区设置不同 导致SimpleDateFormat类解析结果不同导致 mark一下 Java中的SimpleDateFormat类具有将D
  • floyd算法 O(n^3)

    标准弗洛伊德算法 三重循环 循环结束之后 d i j 存储的就是点 i 到点 j 的最短距离 需要注意循环顺序不能变 第一层枚举中间点 第二层和第三层枚举起点和终点 特点 1 复杂度为O n 3 只能处理200以内的点 2 一次求出所有结点
  • Kali 2020.1版本 安装VMware Tools

    Kali 2020 1版本 安装VMware Tools 文章目录 Kali 2020 1版本 安装VMware Tools 1 虚拟机 gt 安装VMware Tools 2 终端输入命令df h确定是否已经挂载 3 进入挂载的目录下 将
  • 数字预失真技术的基本原理及其MATLAB实现

    数字预失真技术的基本原理及其MATLAB实现 数字预失真技术是一种用于提高无线通信系统性能的技术 其基本原理是在系统发送信号之前先对信号进行一定的失真 以抵消后续传输过程中的非线性影响 而MATLAB作为一款强大的数学计算软件 可以帮助我们
  • C语言里的延时函数

    C语言延时 悬赏分 0 解决时间 2007 2 18 14 48s级的时间延时杂写啊 大侠们帮哈忙啊 最佳答案 在Windows下最简单的办法是调用系统函数Sleep time 单位是ms 在windows h中声明 注意大小写 不然就用
  • anaconda安装和使用

    安装 1 1 下载安装脚本 wget https mirrors tuna tsinghua edu cn anaconda archive Anaconda3 2020 07 Linux x86 64 sh 1 2 运行安装向导 bash
  • vue引入全局自定义组件

    1 告知 本案例使用的vue3 x 2 在src下 新建如下文件夹及文件 名称可随意 3 wb loading vue内容如下
  • 【机器人学】使用代数法求解3自由度拟人机械臂的逆运动学解

    这篇博客会讨论一下使用解析法求解3自由度拟人机械臂的逆解及分析 一 机械臂的逆解 机械臂的逆运动学问题就是由给定的末端执行器位置和方向 确定机械臂各个关节变量的值 机械臂的求解方法可以分为两大类 数值解和解析解 封闭解 解析解又可分为代数解
  • “泰迪杯”挑战赛-争对主流论坛(新浪,天涯,哇哈哈)进行正文提取

    目 录 挖掘目标 全文脉络图 爬虫技术简介 3 1 爬虫简介 3 2 正则表达式介绍 具体步骤 4 1 解题思路 4 2 提取主题帖 4 3 提取回帖 效果展示 5 1 哇哈体育论坛爬虫结果 5 2 新浪论坛爬虫结果 5 3 天涯论坛爬虫结
  • 2万字带你了解Selenium全攻略

    大家好 我是才哥 今天带大家一起学 复 习模拟浏览器运行的库Selenium 它是一个用于Web应用程序测试的工具 Selenium测试直接运行在浏览器中 就像真正的用户在操作一样 支持的浏览器包括IE 7 8 9 10 11 Mozill
  • 堆的核心概述

  • 【Unity3D】笔记之OnGUI()下的自适屏

    转眼离上一篇博客的已有半年之久 想当初 满怀激情的说要坚持更新博客 记录学习笔记 但要真正坚持下去 确实需要非凡的毅力啊 脑子的那股热一散去整个人就懒了 还记得那时正准备写篇关于在OnGUI 方法下UI如何自动适应屏幕分辨率变化 但一直拖着
  • 蓝桥杯考前必看知识点【python 代码详解】

    文章目录 前言 一 基本知识点 1 基本输入输出 2 列表转字符串 3 字符串大小写转换 4 匿名函数lambda 5 二 八 十六进制 6 chr ord转换 7 保留小数点后几位 8 排序 二 python常用内置库模块 1 facto
  • “毕业1年,做Python挣了50W!”我摊牌了......

    现状揭秘 Python岗位大厂50K起 屠杀各种榜单 拿下语言排行榜的Python 薪酬真的如同网传开挂了吗 笔者在脉脉上发现了这样的一个信息 但Python真的这么火 笔者准备去全网帮你们 打探 一下 让大家了解真实的Python市场 数
  • h5+js调取相机做取景框_uni-app 2.2发布,大幅优化H5端性能体验

    背景 uni app发布以来 已经服务了几十万开发者 让我们意外 或者说惊喜的是 有大量开发者用uni app只编写H5版 并没有多端发布 可参考案例 这其实也符合uni app的初衷 uni app的定位并不是需要多端发布时才用uni a
  • Electron-日志与崩溃收集

    概述 对于任何的客户端应用 开发者都希望能够在用户上的手上记录下相关信息以便了解真实的使用情况 一般情况下 分为以下两种信息 正常日志 在不涉及隐私的情况下 让开发者了解用户使用客户端的详细情况 从这些情况中提炼的信息能够让开发者根据用户的
  • linux自动补全命令

    CentOS6 5安装Tab增强版 bash completion 可补全命令参数 因为CentOS官方源并不带有bash completion的包 所以 为了可用yum安装 增加epel的源 首先 使用wget下载epel的rpm包 使用
  • ELK-定期清除数据

    bin bash Author richard Date 2017 08 11 17 27 49 Last Modified by richard Last Modified time 2017 08 11 18 04 58 保留近 N 天
  • samba服务器经windows共享后虚拟机中文件权限nobody,nogroup

    前几天想共享文件到虚拟机的ubuntu结果新建的网络映射一会能看到共享文件夹但无打开权限一会直接连接不上 毕竟是新手只能百度试了病急乱投医N种方法仍然不能解决对于有强迫症的我弄了将近2个多小时依然没有解决于是 恼羞成怒 吧samba的程序卸
  • 带刻度尺的日期选择器

    带刻度尺的日期选择器 1 概述 2 试着使用UIPickerView实现 3 使用UICollectionView实现 1 获取一年12个月的数据 2 滚动到1月1号和12月31号的时候如何能够无缝的显示 4 模糊 渐变 写在前面的话 最近