视图控件

iOS开发--时间选择器UIDatePicker封装

2018-03-15  本文已影响1811人  生无可恋的程序员

之前项目要用到时间选择器,要求是返回特定格式时间,并根据时间判断今明后并显示,所以就根据系统自带的UIDatePicker自己动手写了个demo,有需要的朋友阔以拿去用。
没有很复杂的操作,唯一大家不太熟的可能的链式编程,我在这里小试了下还是很方便的。其余就只是用到很简单的继承、封装、类方法的调用、block的使用、时间的转换等,我想大家都能搞定。布局用了第三方的Masonry,为了方便时间格式转换添加了NSDate的扩展。
Demo地址:
码云: https://gitee.com/Leesonpeng/LSPDatePicker
GitHub: https://github.com/leesonp/LSPDatePicker
假如只要显示年月日调用下面的方法就行了:

//导入LSPDatePicker.h直接调用此方法就可返回年月日格式为:@"yyyy-MM-dd",默认是当前时间
[LSPDatePicker showInView:self.view selectedCallBack:^(NSString *date) {
    //do something
}];

若要传入初始服务器时间,只需要用初始化一个LSPDatePicker对象接收,并传入时间和相应格式便可:

//初始化LSPDatePicker对象,调用类方法
LSPDatePicker *datePicker = [LSPDatePicker showInView:self.view selectedCallBack:^(NSString *date) {

 }];
/*
      切记:
      dateStyle(参数1,参数2)里的参数1和参数2的格式要统一,不然会造成程序崩溃.
      DateTypeHMS为枚举,Date格式。
      dateStr为服务器时间字符串,也可是你选择返回的时间。

      此处用到了链式编程思想(不懂何为链式编程的童鞋可以自行百度)
 */
datePicker.dateStyle(DateTypeHMS,dateStr);

下面贴上LSPDatePicker的完整代码:

//
//  LSPDatePicker.h
//  LSPDatePicker
//
//  Created by leeson on 2018/3/6.
//  Copyright © 2018年 李斯芃 ---> 512523045@qq.com. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "Masonry.h"
#import "NSDate+Ex.h"
#import "NSDate+Search.h"

typedef NS_ENUM(NSUInteger, DateType) {
    ///yyyy-MM-dd
    DateTypeMYD      = 0,
    ///yyyy-MM-dd HH:mm
    DateTypeHM      = 1,
    ///yyyy/MM/dd HH:mm:ss
    DateTypeHMS      = 2,
    ///yyyy/MM/dd HH:mm EEE
    DateTypeWEEK      = 3,
};

typedef void(^DateChooseCallBack)(NSString *date);

@interface LSPDatePicker : UIView

@property (copy, nonatomic) DateChooseCallBack dateChooseCallBack;

///MARK: - --- 外部调用API
+ (LSPDatePicker*)showInView:(UIView *)view selectedCallBack:(DateChooseCallBack)callBack;

///MARK: - --- 链式编程扩展方法(传入类型,时间并且要求两者格式一致)
- (LSPDatePicker * (^)(NSInteger dateType,NSString *dateStr))dateStyle;

@end

//
//  LSPDatePicker.m
//  LSPDatePicker
//
//  Created by leeson on 2018/3/6.
//  Copyright © 2018年 李斯芃 ---> 512523045@qq.com. All rights reserved.
//

#import "LSPDatePicker.h"

#define TEXT_COLOR   COLOR_RGBA(61, 147, 236, 1)
#define COLOR_RGBA(r, g, b, a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:a]
#define Font(size)      [UIFont systemFontOfSize:size]
#define DateFormatDic(dateType) @{@0:@"yyyy-MM-dd",@1:@"yyyy-MM-dd HH:mm",@2:@"yyyy/MM/dd HH:mm:ss",@3:@"yyyy/MM/dd HH:mm EEE"}[dateType]

@interface LSPDatePicker ()

@property (strong, nonatomic) UIView *maskView;
@property (strong, nonatomic) UIView *pickerConten;
@property (strong, nonatomic) UIDatePicker *picker;
@property (strong, nonatomic) UIView *toolBar;
@property (strong, nonatomic) UIButton *sure;
@property (strong, nonatomic) UIButton *cancle;
@property (assign, nonatomic) NSInteger dateType;

@end

@implementation LSPDatePicker

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        self.maskView = [[UIView alloc] init];
        self.maskView.backgroundColor = COLOR_RGBA(0, 0, 0, 0.05);
        [self addSubview:self.maskView];
        
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideViews)];
        [self.maskView addGestureRecognizer:tap];
        
        [self.maskView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.edges.mas_equalTo(UIEdgeInsetsMake(0, 0, 0, 0));
        }];
        
        self.pickerConten = [[UIView alloc] init];
        [self addSubview:self.pickerConten];
        
        [self.pickerConten mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.right.bottom.mas_equalTo(0);
            make.height.mas_equalTo(220);
        }];
        
        self.picker = [[UIDatePicker alloc] init];
        self.picker.datePickerMode = UIDatePickerModeDate;
        self.picker.date = [NSDate date];
        self.picker.backgroundColor = [UIColor whiteColor];
        [self.pickerConten addSubview:self.picker];
        
        [self.picker mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.bottom.right.mas_equalTo(0);
            make.height.mas_equalTo(190);
        }];
        
        self.toolBar = [[UIView alloc] init];
        self.toolBar.backgroundColor = [UIColor whiteColor];
        [self.pickerConten addSubview:self.toolBar];
        
        [self.toolBar mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.right.mas_equalTo(0);
            make.bottom.mas_equalTo(self.picker.mas_top);
            make.height.mas_equalTo(30);
        }];
        
        self.cancle = [UIButton buttonWithType:UIButtonTypeCustom];
        self.cancle.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
        self.cancle.titleLabel.font = Font(15);
        self.cancle.tag = 1;
        [self.cancle setTitleEdgeInsets:(UIEdgeInsets){0, 15, 0, 0}];
        [self.cancle setTitleColor:TEXT_COLOR forState:UIControlStateNormal];
        [self.cancle setTitle:@"取消" forState:UIControlStateNormal];
        [self.pickerConten addSubview:self.cancle];
        
        [self.cancle mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.top.bottom.mas_equalTo(self.toolBar);
            make.right.mas_equalTo(self.toolBar.mas_centerX);
        }];
        
        self.sure = [UIButton buttonWithType:UIButtonTypeCustom];
        self.sure.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;
        self.sure.titleLabel.font = Font(15);
        self.sure.tag = 2;
        [self.sure setTitleEdgeInsets:(UIEdgeInsets){0, 0, 0, 15}];
        [self.sure setTitleColor:TEXT_COLOR forState:UIControlStateNormal];
        [self.sure setTitle:@"确定" forState:UIControlStateNormal];
        [self.pickerConten addSubview:self.sure];
        
        [self.sure mas_makeConstraints:^(MASConstraintMaker *make) {
            make.right.top.bottom.mas_equalTo(self.toolBar);
            make.left.mas_equalTo(self.toolBar.mas_centerX);
        }];
        
        [self.cancle addTarget:self action:@selector(buttonDidClick:) forControlEvents:UIControlEventTouchUpInside];
        [self.sure addTarget:self action:@selector(buttonDidClick:) forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}

+ (LSPDatePicker *)showInView:(UIView *)view selectedCallBack:(DateChooseCallBack)callBack {
    LSPDatePicker *datePicker = [[LSPDatePicker alloc] initWithFrame:view.bounds];
    datePicker.dateChooseCallBack = callBack;
    [view addSubview:datePicker];
    
    datePicker.pickerConten.transform = CGAffineTransformMakeTranslation(0, 220);
    datePicker.maskView.alpha = 0;
    
    [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        datePicker.pickerConten.transform = CGAffineTransformIdentity;
        datePicker.maskView.alpha = 1;
    } completion:^(BOOL finished) {
        
    }];
    
    return datePicker;
}

///MARK: - --- 隐藏视图
- (void)hideViews{
    [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        self.pickerConten.transform = CGAffineTransformMakeTranslation(0, 220);
        self.maskView.alpha = 0;
    } completion:^(BOOL finished) {
        [self removeFromSuperview];
    }];

}

///MARK: - --- 取消、确定按钮点击事件
- (void)buttonDidClick:(UIButton *)button {
    if (button.tag == 1) {
        [self hideViews];
    }else {
        if (self.dateChooseCallBack) {
            //返回的时间格式
            self.dateChooseCallBack([self.picker.date stringWithFormat:DateFormatDic(@(self.dateType))]);
            [self hideViews];
        }
    }
}

- (LSPDatePicker * (^)(NSInteger dateType,NSString *dateStr))dateStyle{
    return ^LSPDatePicker *(NSInteger dateType,NSString *dateStr) {
        if (dateType == DateTypeHM || dateType == DateTypeHMS || dateType == DateTypeWEEK) {
            self.dateType = dateType;
            self.picker.datePickerMode = UIDatePickerModeDateAndTime;
        }else if (dateType == DateTypeMYD){
            dateStr = [dateStr componentsSeparatedByString:@" "][0];
        }
        self.picker.date = [NSDate dateWithString:dateStr format:DateFormatDic(@(self.dateType))];
        return self;
    };
}

@end

若要接入项目还要导入demo中的Masonry.h以及扩展类NSDate+Ex.h、NSDate+Search.h。
demo中我只是针对我个人的需求展示如下格式,所以要别的格式的需要自行修改代码,不然会崩溃。

demo效果
代码地址:
码云: https://gitee.com/Leesonpeng/LSPDatePicker
GitHub: https://github.com/leesonp/LSPDatePicker
有什么问题下面可以留言讨论,有时间会回复。做的不好的,欢迎指出,共同进步,谢谢。
上一篇下一篇

猜你喜欢

热点阅读