You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
252 lines
7.7 KiB
252 lines
7.7 KiB
// |
|
// JGPicker.m |
|
// JGPicker |
|
// |
|
// Created by stkcctv on 16/12/14. |
|
// Copyright © 2016年 JG. All rights reserved. |
|
// |
|
|
|
#import "JGPicker.h" |
|
#import "Masonry.h" |
|
|
|
#define ZERO 0 |
|
#define SCREEN_WIDTH [[UIScreen mainScreen] bounds].size.width |
|
#define SCREEN_HEIGHT [[UIScreen mainScreen] bounds].size.height |
|
#define TOP_HEIGHGT 30 |
|
#define BUTTON_WIDTH 30 |
|
#define BUTTON_HEIGHT 30 |
|
|
|
#define DATAPICKER_HEIGHT 200 |
|
|
|
#define WS(weakSelf) __weak __typeof(&*self)weakSelf = self; |
|
|
|
|
|
#define cusColor(r,g,b,a) [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:a] // 颜色 |
|
#define cusFont(font) [UIFont systemFontOfSize:font] // 字体 |
|
#define sureCellGrayColor cusColor(120, 120, 120, 1.0) // 灰色 |
|
#define circleNum 6 // 圆角的度数 |
|
#define screenWidthW [[UIScreen mainScreen] bounds].size.width |
|
#define screenHeightH [[UIScreen mainScreen] bounds].size.height |
|
|
|
|
|
#define headViewHHHHH 45 // 头视图的高度 |
|
#define datePickerHHHH 250 // pickView的高度 |
|
|
|
#define backButtonLeftDistance 0 |
|
#define backButtonW 60 // 取消和确定按钮的宽高 |
|
#define backButtonH 45 |
|
|
|
#define okButtonW 60 |
|
#define okButtonH 45 |
|
|
|
@implementation JGPicker |
|
|
|
+(instancetype)datePickerViewWithType:(UIDatePickerMode)type andDelegate:(id)delegate; |
|
{ |
|
JGPicker *picker = [[JGPicker alloc] initWithFrame:[UIScreen mainScreen].bounds type:type andDelegate:delegate]; |
|
|
|
return picker; |
|
} |
|
|
|
- (instancetype)initWithFrame:(CGRect)frame type:(UIDatePickerMode)type andDelegate:(id)delegate; |
|
{ |
|
if (frame.size.width>frame.size.height) |
|
{ |
|
float a = frame.size.height; |
|
frame.size.height = frame.size.width; |
|
frame.size.height = a; |
|
} |
|
self = [super initWithFrame:frame]; |
|
if (self) |
|
{ |
|
self.type = type; |
|
self.delegate = delegate; |
|
[self addSubview:self.backgroundView]; |
|
[self initializationDatePicker]; |
|
[self initializationTopView]; |
|
[self initializationCancleButton]; |
|
[self initializationDetermineButton]; |
|
} |
|
|
|
|
|
return self; |
|
} |
|
|
|
- (UIView *)backgroundView |
|
{ |
|
// 不能用self.backgroundView 不然会循环引用 |
|
if (!_backgroundView) |
|
{ |
|
self.backgroundView = [[UIView alloc] initWithFrame:self.frame]; |
|
CGFloat widthWithView=self.frame.size.width; |
|
|
|
[self setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:0.5]]; // 半透明 |
|
UIView *bg = [[UIView alloc] initWithFrame:CGRectMake(0,self.frame.size.height-(datePickerHHHH+headViewHHHHH),widthWithView,datePickerHHHH+headViewHHHHH)]; //蒙版视图的Frame |
|
[bg setBackgroundColor:[UIColor whiteColor]]; |
|
bg.layer.cornerRadius=circleNum; |
|
bg.layer.masksToBounds=YES; |
|
[self addSubview:bg]; |
|
|
|
|
|
|
|
|
|
} |
|
return _backgroundView; |
|
} |
|
|
|
//初始化TopView |
|
- (void)initializationTopView |
|
{ |
|
self.topView = [[UIToolbar alloc]initWithFrame:CGRectMake(0,screenHeightH - datePickerHHHH - headViewHHHHH, screenWidthW,headViewHHHHH)]; |
|
self.topView.backgroundColor = [UIColor orangeColor]; |
|
[self.backgroundView addSubview:self.topView]; |
|
|
|
|
|
|
|
[self.topView setBackgroundColor:cusColor(178, 190,223,1.0)]; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
//初始化datePicker |
|
- (void)initializationDatePicker |
|
{ |
|
|
|
self.datePicker = [UIDatePicker new]; |
|
self.datePicker.datePickerMode = self.type; |
|
self.datePicker.backgroundColor = [UIColor whiteColor]; |
|
self.datePicker.minimumDate = [NSDate date]; |
|
[self.datePicker addTarget:self action:@selector(datePickerChange:) forControlEvents:UIControlEventValueChanged]; |
|
[self.backgroundView addSubview:self.datePicker]; |
|
WS(weakSelf); |
|
[_datePicker mas_makeConstraints:^(MASConstraintMaker *make) { |
|
make.left.equalTo(weakSelf.backgroundView).with.offset(ZERO); |
|
make.right.equalTo(weakSelf.backgroundView).with.offset(ZERO); |
|
make.bottom.equalTo(weakSelf.backgroundView).with.offset(ZERO); |
|
make.height.mas_equalTo(datePickerHHHH); |
|
}]; |
|
|
|
} |
|
|
|
//初始化button |
|
- (void)initializationCancleButton |
|
{ |
|
UIButton *backButton=[[UIButton alloc]initWithFrame:CGRectMake(backButtonLeftDistance,self.topView.frame.size.height/2-backButtonH/2, backButtonW, backButtonH)]; |
|
[backButton setTitle:@"取消" forState:UIControlStateNormal]; |
|
[backButton setTitle:@"取消" forState:UIControlStateHighlighted]; |
|
[backButton setTitleColor:sureCellGrayColor forState:UIControlStateNormal]; |
|
[backButton setTitleColor:sureCellGrayColor forState:UIControlStateHighlighted]; |
|
backButton.titleLabel.font=cusFont(15); |
|
[backButton addTarget:self action:@selector(cancleButtonClick:) forControlEvents:UIControlEventTouchUpInside]; |
|
[self.topView addSubview:backButton]; |
|
|
|
} |
|
- (void)initializationDetermineButton |
|
{ |
|
|
|
UIButton *OKButton=[[UIButton alloc]initWithFrame:CGRectMake(self.topView.frame.size.width-okButtonW,self.topView.frame.size.height/2-okButtonH/2, okButtonW, okButtonH)]; |
|
[OKButton setTitle:@"完成" forState:UIControlStateNormal]; |
|
[OKButton setTitle:@"完成" forState:UIControlStateHighlighted]; |
|
OKButton.titleLabel.font=cusFont(15); |
|
[OKButton setTitleColor:cusColor(0, 97, 215, 1.0) forState:UIControlStateNormal]; |
|
[OKButton setTitleColor:cusColor(0, 97, 215, 1.0) forState:UIControlStateHighlighted]; |
|
[OKButton addTarget:self action:@selector(determineButtonClick:) forControlEvents:UIControlEventTouchUpInside]; |
|
[self.topView addSubview:OKButton]; |
|
|
|
} |
|
|
|
- (void)show |
|
{ |
|
// [UIView beginAnimations:nil context:nil]; |
|
// [UIView setAnimationCurve:2]; |
|
[[UIApplication sharedApplication].keyWindow addSubview:self]; |
|
// [UIView commitAnimations]; |
|
} |
|
|
|
- (void)end |
|
{ |
|
[self removeFromSuperview]; |
|
} |
|
|
|
#pragma mark - DatePicker Method |
|
- (void)datePickerChange:(UIDatePicker *)datePicker |
|
{ |
|
// 判断delegate 指向的类是否实现协议方法 |
|
if ([self.delegate respondsToSelector:@selector(changeTime:)]) |
|
{ |
|
[_delegate changeTime:datePicker.date]; |
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#pragma mark - buttonMethod |
|
|
|
- (void)cancleButtonClick:(UIButton *)sender |
|
{ |
|
[self removeFromSuperview]; |
|
} |
|
|
|
- (void)determineButtonClick:(UIButton *)sender |
|
{ |
|
if ([_delegate respondsToSelector:@selector(determinSelected:)]) |
|
{ |
|
[_delegate determinSelected:self.datePicker.date]; |
|
} |
|
[self end]; |
|
} |
|
|
|
|
|
- (NSDate*)dateFromString:(NSString*)dateString{ |
|
|
|
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; |
|
switch (self.type) { |
|
case UIDatePickerModeTime: |
|
[dateFormatter setDateFormat:@"HH:mm"]; |
|
break; |
|
case UIDatePickerModeDate: |
|
[dateFormatter setDateFormat:@"yyyy-MM-dd"]; |
|
break; |
|
case UIDatePickerModeDateAndTime: |
|
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"]; |
|
break; |
|
case UIDatePickerModeCountDownTimer: |
|
[dateFormatter setDateFormat:@"HH:mm"]; |
|
break; |
|
default: |
|
break; |
|
} |
|
NSDate *destDate= [dateFormatter dateFromString:dateString]; |
|
|
|
return destDate; |
|
} |
|
|
|
- (NSString*)stringFromDate:(NSDate*)date{ |
|
|
|
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; |
|
switch (self.type) { |
|
case UIDatePickerModeTime: |
|
[dateFormatter setDateFormat:@"HH:mm"]; |
|
break; |
|
case UIDatePickerModeDate: |
|
[dateFormatter setDateFormat:@"yyyy-MM-dd"]; |
|
break; |
|
case UIDatePickerModeDateAndTime: |
|
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"]; |
|
break; |
|
case UIDatePickerModeCountDownTimer: |
|
[dateFormatter setDateFormat:@"HH:mm"]; |
|
break; |
|
default: |
|
break; |
|
} |
|
NSString *destDateString = [dateFormatter stringFromDate:date]; |
|
|
|
return destDateString; |
|
|
|
} |
|
|
|
@end
|
|
|