全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

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

主要功能:

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

如果需要可以根据自己的需求来修改界面, 效果如下:

主要步骤:

  1. 创建时间选择器Picker 且确认取消按钮实现功能逻辑
  2. 创建展示时间菜单的按钮视图 (按钮: 图片在右,标题在左的按钮)
  3. 创建时间选择器视图 且 起始时间/截止时间逻辑判断
  4. 使用代理传值起始时间/截止时间(时间串转换)

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

自定义ZLDatePickerView 文件:

@property (nonatomic, assign) id<ZLDatePickerViewDelegate> deleagte;
// 最初/小时间(一般为左边值)
@property (nonatomic, strong) NSDate *minimumDate;
// 截止时间(一般为右边值)
@property (nonatomic, strong) NSDate *maximumDate;
// 当前选择时间
@property (nonatomic, strong) NSDate *date;


+ (instancetype)datePickerView;

- (void)showFrom:(UIView *)view;

使用代理传值:

@protocol ZLDatePickerViewDelegate <NSObject>

- (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文件:

@property (nonatomic, weak) ZLTimeBtn *beginTimeBtn;
@property (nonatomic, weak) UILabel *label;
@property (nonatomic, weak) ZLTimeBtn *endTimeBtn;
- (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);
}

使用代理:

@protocol ZLTimeViewDelegate <NSObject>

/**
 * 时间选择器视图
 *
 * @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"
@property (nonatomic, copy) NSString *begintime;
@property (nonatomic, copy) NSString *endtime;

@property (nonatomic, weak) UIButton *beginTimeBtn;
@property (nonatomic, weak) UIButton *endTimeBtn;

@property (nonatomic, strong) ZLTimeView *timeView;
#pragma mark - 懒加载

- (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];

使用代理:

<ZLTimeViewDelegate>
#pragma mark - ZLTimeViewDelegate

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

当多出使用时,用起来是不是很方便, 这时候测试看下效果:

以上是部分代码, 如果需要 Demo 

希望本文所述对你有所帮助,iOS实现自定义起始时间选择器视图就给大家介绍到这里了。希望大家继续关注我们的网站!想要学习iOS可以继续关注本站。


# iOS起始时间选择器  # iOS  # 时间选择器  # ios时间选择器  # jQuery基于muipicker实现仿ios时间选择  # 详解iOS时间选择框  # iOS如何获取当前日期前后N天的时间示例代码  # Android仿IOS10圆盘时间选择器  # iOS自定义时间滚动选择控件  # 选择器  # 截止时间  # 自定义  # 所需  # 可以根据  # 第二步  # 自己的  # 都是  # 上传  # 器里  # 不需要  # 对你  # 希望大家  # 没必要  # 多出  # 主要功能  # 就给  # 很方便  # 所述  # 不能超过 


相关文章: 如何解决ASP生成WAP建站中文乱码问题?  如何打造高效商业网站?建站目的决定转化率  佛山企业网站制作公司有哪些,沟通100网上服务官网?  Swift中swift中的switch 语句  设计网站制作公司有哪些,制作网页教程?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  如何用狗爹虚拟主机快速搭建网站?  用v-html解决Vue.js渲染中html标签不被解析的问题  如何批量查询域名的建站时间记录?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  如何在IIS7中新建站点?详细步骤解析  建站主机默认首页配置指南:核心功能与访问路径优化  建站之星微信建站一键生成小程序+多端营销系统  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  如何在景安服务器上快速搭建个人网站?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  建站上传速度慢?如何优化加速网站加载效率?  家庭服务器如何搭建个人网站?  如何高效生成建站之星成品网站源码?  宝塔新建站点报错如何解决?  专业网站建设制作报价,网页设计制作要考什么证?  建站之星如何助力企业快速打造五合一网站?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  如何在景安云服务器上绑定域名并配置虚拟主机?  专业商城网站制作公司有哪些,pi商城官网是哪个?  如何快速搭建自助建站会员专属系统?  建站之星×万网:智能建站系统+自助建站平台一键生成  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  如何选择香港主机高效搭建外贸独立站?  如何快速搭建高效WAP手机网站吸引移动用户?  已有域名能否直接搭建网站?  专业公司网站制作公司,用什么语言做企业网站比较好?  如何在阿里云虚拟服务器快速搭建网站?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  如何破解联通资金短缺导致的基站建设难题?  建站之星如何实现PC+手机+微信网站五合一建站?  大连 网站制作,大连天途有线官网?  如何快速搭建响应式可视化网站?  ,sp开头的版面叫什么?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  视频网站制作教程,怎么样制作优酷网的小视频?  如何快速生成高效建站系统源代码?  如何在Windows服务器上快速搭建网站?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  如何通过虚拟机搭建网站?详细步骤解析  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。