服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS实现自定义起始时间选择器视图

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

2021-03-18 15:58smile丽语 IOS

本篇文章主要介绍了iOS实现自定义起始时间选择器视图,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

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

主要功能:

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

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

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

主要步骤:

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

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

自定义zldatepickerview 文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
@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;

使用代理传值:

?
1
2
3
4
5
@protocol zldatepickerviewdelegate <nsobject>
 
- (void)datepickerview:(zldatepickerview *)pickerview backtimestring:(nsstring *)string to:(uiview *)view;
 
@end

使用 xib 展现datepicker:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
+ (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];
}

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

?
1
2
3
4
5
6
7
8
9
10
11
- (void)setminimumdate:(nsdate *)minimumdate {
  self.datepicker.minimumdate = minimumdate;
}
 
- (void)setmaximumdate:(nsdate *)maximumdate {
  self.datepicker.maximumdate = maximumdate;
}
 
- (void)setdate:(nsdate *)date {
  self.datepicker.date = date;
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
- (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文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- (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文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
- (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"];
}

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

?
1
2
3
4
5
6
7
8
9
10
11
#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文件:

?
1
2
3
@property (nonatomic, weak) zltimebtn *begintimebtn;
@property (nonatomic, weak) uilabel *label;
@property (nonatomic, weak) zltimebtn *endtimebtn;
?
1
2
3
4
5
6
7
8
- (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);
}

使用代理:

?
1
2
3
4
5
6
7
8
9
10
11
12
@protocol zltimeviewdelegate <nsobject>
 
/**
 * 时间选择器视图
 *
 * @param begintime      起始时间/开始时间
 * @param endtime       终止时间按/结束时间
 *
 */
- (void)timeview:(zltimeview *)timeview seleteddatebegin:(nsstring *)begintime end:(nsstring *)endtime;
 
@end

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#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];
  }
}

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

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

?
1
#import "zltimeview.h"
?
1
2
3
4
5
6
7
@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;
?
1
2
3
4
5
6
7
8
9
10
11
#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;
}
?
1
2
// 起始时间选择器控件
[self.view addsubview:self.timeview];

使用代理:

?
1
<zltimeviewdelegate>
?
1
2
3
4
5
#pragma mark - zltimeviewdelegate
 
- (void)timeview:(zltimeview *)timeview seleteddatebegin:(nsstring *)begintime end:(nsstring *)endtime {
  // todo: 进行上传时间段
}

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

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

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

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

原文链接:http://www.jianshu.com/p/6daacaf24f48?utm_source=tuicool&utm_medium=referral

延伸 · 阅读

精彩推荐
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03