热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS自定义起始时间选择器视图

概述自定义起始时间选择器视图,调起时间选择器,传值(起始时间截止时间),两者时间均要合理,不能超过未来时间,并且起始时间不能大于截止时间.点击取消或空白处收起时间选择器.详细代码下
概述
自定义起始时间选择器视图, 调起时间选择器, 传值(起始时间/截止时间), 两者时间均要合理, 不能超过未来时间, 并且起始时间不能大于截止时间. 点击取消或空白处收起时间选择器.
详细

代码下载:http://www.demodashi.com/demo/10670.html

随着界面的整体效果的各种展现, 起始时间选择器的展现也需求突出!

最近项目中发现时间选择器使用处还挺多, 数了数原型图发现有6处. 便决定自定义时间选择器视图写个 Demo, 封装好在所需控制器里直接调用!

 

一、实现功能及主要思路

实现功能:

自定义起始时间选择器视图, 调起时间选择器, 传值(起始时间/截止时间), 两者时间均要合理, 不能超过未来时间, 并且起始时间不能大于截止时间. 点击取消或空白处收起时间选择器.

其中两者时间(起始时间/截止时间)是可以做限制,例如:当月月初1日 到 当天时间.

 

主要思路:

 

  • 1. 创建时间选择器Picker 且确认取消按钮实现功能逻辑

  • 2. 创建展示时间菜单的按钮视图 (按钮: 图片在右,标题在左的按钮)

  • 3. 创建时间选择器视图 且 起始时间/截止时间逻辑判断

  • 4. 使用代理传值起始时间/截止时间(时间串转换)

二、程序实现

第一步. 创建时间选择器Picker 且确认取消按钮实现功能逻辑

自定义ZLDatePickerView 文件:

@property (nonatomic, assign) id deleagte;
// 最初/小时间(一般为左边值)
@property (nonatomic, strong) NSDate *minimumDate;
// 截止时间(一般为右边值)
@property (nonatomic, strong) NSDate *maximumDate;
// 当前选择时间
@property (nonatomic, strong) NSDate *date;
+ (instancetype)datePickerView;
- (void)showFrom:(UIView *)view;

使用代理传值:

@protocol ZLDatePickerViewDelegate
- (void)datePickerView:(ZLDatePickerView *)pickerView backTimeString:(NSString *)string To:(UIView *)view;
@end

使用 xib 展现datePicker:

+ (instancetype)datePickerView {ZLDatePickerView *picker = [[NSBundle mainBundle] loadNibNamed:@"ZLDatePickerView" owner:nil options:nil].lastObject;picker.frame = CGRectMake(0, UI_View_Height - 250, UI_View_Width, 250);picker.maximumDate = [NSDate date];return picker;
}
- (void)showFrom:(UIView *)view {UIView *bgView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];bgView.backgroundColor = [UIColor lightGrayColor];bgView.alpha = 0.5;UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];[bgView addGestureRecognizer:tap];self.fromView = view;self.bgView = bgView;[[UIApplication sharedApplication].keyWindow addSubview:self.bgView];[[UIApplication sharedApplication].keyWindow addSubview:self];
}

起始时间/截止时间设值:

- (void)setMinimumDate:(NSDate *)minimumDate {self.datePicker.minimumDate = minimumDate;
}
- (void)setMaximumDate:(NSDate *)maximumDate {self.datePicker.maximumDate = maximumDate;
}
- (void)setDate:(NSDate *)date {self.datePicker.date = date;
}

确认/取消按钮实现功能逻辑:

- (IBAction)cancel:(id)sender {[self dismiss];
}
- (IBAction)makeSure:(id)sender {[self dismiss];NSDate *date = self.datePicker.date;if ([self.deleagte respondsToSelector:@selector(datePickerView:backTimeString:To:)]) {[self.deleagte datePickerView:self backTimeString:[self fomatterDate:date] To:self.fromView];}
}

 

第二步. 创建展示时间菜单的按钮视图 (按钮: 图片在右,标题在左的按钮)

这个可以根据需求来,有些不需要这个按钮图片在右边的,则没必要添加.

自定义ZLOppositeButton文件:

- (void)layoutSubviews {[super layoutSubviews];CGFloat margin = 10;// 替换 title 和 image 的位置// 图片在右,标题在左// 由于 button 内部的尺寸是自适应的.调整尺寸即可CGFloat maxWidth = self.width - self.imageView.width - margin;if (self.titleLabel.width >= maxWidth) {self.titleLabel.width = maxWidth;}CGFloat totalWidth = self.titleLabel.width + self.imageView.width;self.titleLabel.x = (self.width - totalWidth - margin) * 0.5;self.imageView.x = CGRectGetMaxX(self.titleLabel.frame) + margin;
}

接着利用上面的按钮创建一个展示时间菜单的按钮视图ZLTimeBtn文件:

- (void)setup {self.backgroundColor = [UIColor clearColor];[self setImage:[UIImage imageNamed:@"xiangxiadianji"] forState:UIControlStateNormal];[self setTitle:[self timeStringDefault] forState:UIControlStateNormal];[self setTitleColor:ZLColor(102, 102, 102) forState:UIControlStateNormal];self.titleLabel.font = [UIFont systemFontOfSize:14];
}
// 时间默认展示当天
- (NSString *)timeStringDefault {NSDate *date = [NSDate date];return [date timeFormat:@"yyyy-MM-dd"];
}

其中我们上传时间一般都是字符串而不是时间戳, 则需要进行转换:

#import "NSDate+ZLDateTimeStr.h"

- (NSString *)timeFormat:(NSString *)dateFormat {NSDateFormatter *formatter = [[NSDateFormatter alloc] init];[formatter setDateStyle:NSDateFormatterMediumStyle];[formatter setTimeStyle:NSDateFormatterShortStyle];[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];[formatter setDateFormat:dateFormat];return [formatter stringFromDate:self];
}

 

第三步. 创建时间选择器视图 且 起始时间/截止时间逻辑判断

利用第二步自定义的按钮来自定义ZLTimeView文件:

- (void)layoutSubviews {[super layoutSubviews];self.beginTimeBtn.frame = CGRectMake(0, 0, self.width / 5.0 * 2, self.height);self.label.frame = CGRectMake(CGRectGetMaxX(self.beginTimeBtn.frame), 0, self.width / 5, self.height);self.endTimeBtn.frame = CGRectMake(CGRectGetMaxX(self.label.frame),0 , self.width / 5.0 * 2, self.height);self.line.frame = CGRectMake(0, self.height - 1, self.width, 1);
}

- (void)setupSubview {// 起始时间按钮YYPTimeBtn *beginTimeBtn = [[YYPTimeBtn alloc] init];beginTimeBtn.backgroundColor = [UIColor clearColor];[beginTimeBtn addTarget:self action:@selector(beginTimeBtnClick:) forControlEvents:UIControlEventTouchUpInside];// 起始时间默认展示当月一号// [beginTimeBtn setTitle:[self timeStringDefaultWith:@"yyyy-MM-01"] forState:UIControlStateNormal];[self addSubview:beginTimeBtn];self.beginTimeBtn = beginTimeBtn;// 至labelUILabel *label = [[UILabel alloc] init];label.backgroundColor = [UIColor clearColor];label.text = @"——";label.textColor = YYPWhiteTitleColor;label.font = [UIFont systemFontOfSize:14];label.textAlignment = NSTextAlignmentCenter;self.label = label;[self addSubview:label];// 终止时间按钮YYPTimeBtn *endTimeBtn = [[YYPTimeBtn alloc] init];[endTimeBtn addTarget:self action:@selector(endTimeBtnClick:) forControlEvents:UIControlEventTouchUpInside];// 终止时间默认展示当天// [endTimeBtn setTitle:[self timeStringDefaultWith:@"yyyy-MM-dd"] forState:UIControlStateNormal];self.endTimeBtn = endTimeBtn;[self addSubview:endTimeBtn];UIView *line = [[UIView alloc] init];line.backgroundColor = YYPColor(204, 204, 204);self.line = line;[self addSubview:line];
}

这里强调一点: 如果默认展示的起始时间均为当天时间时,则在可在自定义按钮里设置就好,不需添加下面方法.

// 自定义默认展示的当月起始时间
- (NSString *)timeStringDefaultWith:(NSString *)timeFormat {NSDate *date = [NSDate date];return [date timeFormat:timeFormat];
}

使用代理:

@protocol ZLTimeViewDelegate
/*** 时间选择器视图** @param beginTime 起始时间/开始时间* @param endTime 终止时间按/结束时间**/
- (void)timeView:(ZLTimeView *)timeView seletedDateBegin:(NSString *)beginTime end:(NSString *)endTime;
@end

使用第一步创建的时间选择器Picker, 来进行起始时间/截止时间逻辑判断:

#pragma mark - ZLDatePickerViewDelegate
- (void)beginTimeBtnClick:(UIButton *)btn {ZLDatePickerView *beginTimePV = [ZLDatePickerView datePickerView];beginTimePV.date = [NSDate stringChangeTimeFormat:@"yyyy-MM-dd" string:btn.titleLabel.text];if (self.maxDate) {beginTimePV.maximumDate = self.maxDate;}beginTimePV.deleagte = self;[beginTimePV showFrom:btn];
}
- (void)endTimeBtnClick:(UIButton *)btn {ZLDatePickerView *endTimePV = [ZLDatePickerView datePickerView];endTimePV.date = [NSDate stringChangeTimeFormat:@"yyyy-MM-dd" string:btn.titleLabel.text];if (self.minDate) {endTimePV.minimumDate = self.minDate;}endTimePV.deleagte = self;[endTimePV showFrom:btn];
}
- (void)datePickerView:(ZLDatePickerView *)pickerView backTimeString:(NSString *)string To:(UIView *)view {UIButton *btn = (UIButton *)view;if (btn == self.beginTimeBtn) {self.minDate = [NSDate stringChangeTimeFormat:@"yyyy-MM-dd" string:string];}if (btn == self.endTimeBtn) {self.maxDate = [NSDate stringChangeTimeFormat:@"yyyy-MM-dd" string:string];}[btn setTitle:string forState:UIControlStateNormal];if ([self.delegate respondsToSelector:@selector(timeView:seletedDateBegin:end:)]) {[self.delegate timeView:self seletedDateBegin:self.beginTimeBtn.titleLabel.text end:self.endTimeBtn.titleLabel.text];}
}

 

第四步. 使用代理传值起始时间/截止时间

在所需控制器里创建起始时间选择器控件:

#import "ZLTimeView.h"

懒加载:

- (ZLTimeView *)timeView {if (!_timeView) {ZLTimeView *timeView = [[ZLTimeView alloc] initWithFrame:CGRectMake(0, 100, UI_View_Width, 50)];timeView.backgroundColor = [UIColor greenColor];timeView.delegate = self;_timeView = timeView;}return _timeView;
}

创建添加起始时间选择器控件:

[self.view addSubview:self.timeView];

使用代理:

#pragma mark - ZLTimeViewDelegate
- (void)timeView:(ZLTimeView *)timeView seletedDateBegin:(NSString *)beginTime end:(NSString *)endTime {// TODO: 进行上传时间段
}

三、压缩文件截图及运行效果

  1. 压缩文件截图:F17EC04A-4787-45D0-BA94-A61A85A73E25.png

2. 项目截图

C3DFB9C1-207F-46A1-8BD7-75F35C74591F.png

3.运行效果:

时间选择器.gif

 

4.效果截图:

截图.png

四、其他补充

界面性问题可以根据自己项目需求调整即可, 具体可参考代码, 项目能够直接运行!

 

代码下载:http://www.demodashi.com/demo/10670.html

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权


转:https://www.cnblogs.com/demodashi/p/8481654.html



推荐阅读
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
author-avatar
用户r7t3govjq0
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有