以前在网上下了个时间选择器Demo,由于封装成UIActionSheet类型,而ios8弃用了UIActionSheet和UIAlertView,不得不对代码进行修改。将封装的UIActionSheet改为UIView,为了多态初始化时添加了枚举(几个时间选择器样式)。
以前下载的Demo网址实在找不到了,对原作者表示抱歉。
参考:DateTimeYearPickerView,UIActionSheet上添加UIPickerView iOS8替换方案
项目:点击下载
UIActionSheet改为UIView核心代码为以下几个方法:
- (void)showInView:(UIView *)view; // UIPicker显示
-(void)hidePickerView; // UIPicker隐藏
- (UIViewController *)viewController; // 通过UIView查找UIViewController
#import "DateTimePickerView.h"
@implementation DateTimePickerView
@synthesize pickView = _pickView;
@synthesize toolBar = _toolBar;
@synthesize pickViewList = _pickViewList;
@synthesize delegate = _delegate;
@synthesize yearArray = _yearArray;
@synthesize monthArray = _monthArray;
@synthesize daysArray = _daysArray;
@synthesize hoursArray = _hoursArray;
@synthesize minutesArray = _minutesArray;
@synthesize selectedYearRow = _selectedYearRow;
@synthesize selectedMonthRow = _selectedMonthRow;
@synthesize selectedDayRow = _selectedDayRow;
@synthesize selectedHourRow = _selectedHourRow;
@synthesize selectedMinRow = _selectedMinRow;
@synthesize timeType = _timeType;
-(void)dealloc
{
self.pickView = nil;
self.toolBar = nil;
self.pickViewList = nil;
self.yearArray=nil;
self.monthArray=nil;
self.daysArray=nil;
self.hoursArray=nil;
self.minutesArray=nil;
[super dealloc];
}
-(id)initWithWidth:(float)width Height:(float)height TimeType:(TimeType)tType WithSheetTitle:(NSString*)title{
self = [super init];
if (self)
{
self.backgroundColor = [UIColor grayColor];
self.timeType = tType;
self.pickView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, width,height)] autorelease];
self.pickView.backgroundColor = [UIColor underPageBackgroundColor];
self.toolBar = [[[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, width, 44)] autorelease];
self.toolBar.barStyle = UIBarStyleDefault;
UIBarButtonItem *titleButton = [[[UIBarButtonItem alloc] initWithTitle:title style: UIBarButtonItemStylePlain target: nil action: nil] autorelease];
UIBarButtonItem *rightButton = [[[UIBarButtonItem alloc] initWithTitle:@"完成" style: UIBarButtonItemStyleDone target: self action: @selector(actionDone)] autorelease];
UIBarButtonItem *leftButton = [[[UIBarButtonItem alloc] initWithTitle:@"取消" style: UIBarButtonItemStyleBordered target: self action: @selector(actionCancel)] autorelease];
UIBarButtonItem *fixedButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemFlexibleSpace target: nil action: nil] autorelease];
NSArray *array = [[[NSArray alloc] initWithObjects: leftButton,fixedButton, titleButton,fixedButton,rightButton, nil] autorelease];
[self.toolBar setItems: array];
[self.pickView addSubview:self.toolBar];
UIPickerView *pickList = [[[UIPickerView alloc] initWithFrame:CGRectMake(0, 44,width,height-44)] autorelease];
pickList.showsSelectionIndicator = YES;//在当前选择上显示一个透明窗口
pickList.delegate = self;
pickList.dataSource = self;
self.pickViewList = pickList;
[self viewLoad:[NSDate date]];
[self.pickView addSubview:pickList];
[self setFrame:self.pickView.frame];
[self addSubview:self.pickView];
}
return self;
}
-(void)viewLoad:(NSDate *)date{
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
// Get Current Hour
[formatter setDateFormat:@"HH"];
NSString *currentHourString = [NSString stringWithFormat:@"%02d时",[[formatter stringFromDate:date] integerValue]];
// Get Current Minutes
[formatter setDateFormat:@"mm"];
NSString *currentMinutesString = [NSString stringWithFormat:@"%02d分",[[formatter stringFromDate:date] integerValue]];
// PickerView - Hours data
self.hoursArray = [[[NSMutableArray alloc]init] autorelease];
for (int i = 0; i < 24 ; i++)
{
[self.hoursArray addObject:[NSString stringWithFormat:@"%02d时",i]];
}
// PickerView - Mins data
self.minutesArray = [[[NSMutableArray alloc] init] autorelease];
for (int i = 0; i < 60; i++)
{
[self.minutesArray addObject:[NSString stringWithFormat:@"%02d分",i]];
}
if (self.timeType==timeDetail) {//timeDetail
// Get Current Year
[formatter setDateFormat:@"yyyy"];
NSString *currentYearString = [NSString stringWithFormat:@"%@年",[formatter stringFromDate:date]];
// Get Current Month
[formatter setDateFormat:@"MM"];
NSString *currentMonthString = [NSString stringWithFormat:@"%d月",[[formatter stringFromDate:date] integerValue]];
// Get Current Date
[formatter setDateFormat:@"dd"];
NSString *currentDateString = [NSString stringWithFormat:@"%d日",[[formatter stringFromDate:date] integerValue]];
// PickerView - Years data
self.yearArray = [[[NSMutableArray alloc] init] autorelease];
for (int i = 1970; i <= 2050 ; i++)
{
[self.yearArray addObject:[NSString stringWithFormat:@"%d年",i]];
}
// PickerView - Months data
self.monthArray = [[[NSMutableArray alloc] init] autorelease];
for (int i = 1; i <= 12 ; i++)
{
[self.monthArray addObject:[NSString stringWithFormat:@"%d月",i]];
}
// PickerView - Days data
self.daysArray = [[[NSMutableArray alloc] init] autorelease];
for (int i = 1; i <= 31; i++)
{
[self.daysArray addObject:[NSString stringWithFormat:@"%d日",i]];
}
// PickerView - Default Selection as per current Date
[self.pickViewList selectRow:[self.yearArray indexOfObject:currentYearString] inComponent:0 animated:YES];
[self.pickViewList selectRow:[self.monthArray indexOfObject:currentMonthString] inComponent:1 animated:YES];
[self.pickViewList selectRow:[self.daysArray indexOfObject:currentDateString] inComponent:2 animated:YES];
[self.pickViewList selectRow:[self.hoursArray indexOfObject:currentHourString] inComponent:3 animated:YES];
[self.pickViewList selectRow:[self.minutesArray indexOfObject:currentMinutesString] inComponent:4 animated:YES];
}else if(self.timeType==timeChinese){//timeChinese
// PickerView - Days data
self.daysArray = [[[NSMutableArray alloc] initWithArray:@[@"今天",@"明天",@"后天"]] autorelease];
[formatter setDateFormat:@"yyyy-MM-dd"];
NSDate *today=[formatter dateFromString:[formatter stringFromDate:[NSDate date]]];
date=[formatter dateFromString:[formatter stringFromDate:date]];
NSTimeInterval secondsPerDay = 24*60*60;
NSDate *tomorrow = [NSDate dateWithTimeInterval:secondsPerDay sinceDate:today];
NSDate *theDayAfterTomorrow = [NSDate dateWithTimeInterval:secondsPerDay*2 sinceDate:today];
NSString *currentDateString = @"";
if ([date compare:today] == NSOrderedSame) {
currentDateString=@"今天";
}else if ([date compare:tomorrow] == NSOrderedSame) {
currentDateString=@"明天";
}else if ([date compare:theDayAfterTomorrow] == NSOrderedSame) {
currentDateString=@"后天";
}
// PickerView - Default Selection as per current Date
[self.pickViewList selectRow:[self.daysArray indexOfObject:currentDateString] inComponent:0 animated:YES];
[self.pickViewList selectRow:[self.hoursArray indexOfObject:currentHourString] inComponent:1 animated:YES];
[self.pickViewList selectRow:[self.minutesArray indexOfObject:currentMinutesString] inComponent:2 animated:YES];
}else{//dateDetail
// Get Current Year
[formatter setDateFormat:@"yyyy"];
NSString *currentYearString = [NSString stringWithFormat:@"%@年",[formatter stringFromDate:date]];
// Get Current Month
[formatter setDateFormat:@"MM"];
NSString *currentMonthString = [NSString stringWithFormat:@"%d月",[[formatter stringFromDate:date] integerValue]];
// Get Current Date
[formatter setDateFormat:@"dd"];
NSString *currentDateString = [NSString stringWithFormat:@"%d日",[[formatter stringFromDate:date] integerValue]];
// PickerView - Years data
self.yearArray = [[[NSMutableArray alloc] init] autorelease];
for (int i = 1970; i <= 2050 ; i++)
{
[self.yearArray addObject:[NSString stringWithFormat:@"%d年",i]];
}
// PickerView - Months data
self.monthArray = [[[NSMutableArray alloc] init] autorelease];
for (int i = 1; i <= 12 ; i++)
{
[self.monthArray addObject:[NSString stringWithFormat:@"%d月",i]];
}
// PickerView - Days data
self.daysArray = [[[NSMutableArray alloc] init] autorelease];
for (int i = 1; i <= 31; i++)
{
[self.daysArray addObject:[NSString stringWithFormat:@"%d日",i]];
}
// PickerView - Default Selection as per current Date
[self.pickViewList selectRow:[self.yearArray indexOfObject:currentYearString] inComponent:0 animated:YES];
[self.pickViewList selectRow:[self.monthArray indexOfObject:currentMonthString] inComponent:1 animated:YES];
[self.pickViewList selectRow:[self.daysArray indexOfObject:currentDateString] inComponent:2 animated:YES];
}
}
#pragma mark -
#pragma mark - UIPickerViewDelegate
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
if (self.timeType==timeDetail) {//timeDetail
if (component == 0)
{
self.selectedYearRow = row;
}
else if (component == 1)
{
self.selectedMonthRow = row;
[self.pickViewList reloadComponent:2];
}
else if (component == 2)
{
self.selectedDayRow = row;
}
else if (component == 3)
{
self.selectedHourRow = row;
}
else if (component == 4)
{
self.selectedMinRow = row;
}
}else if(self.timeType == timeChinese){//timeChinese
if (component == 0)
{
self.selectedDayRow = row;
}
else if (component == 1)
{
self.selectedHourRow = row;
}
else
{
self.selectedMinRow = row;
}
}else{//dateDetail
if (component == 0)
{
self.selectedYearRow = row;
}
else if (component == 1)
{
self.selectedMonthRow = row;
[self.pickViewList reloadComponent:2];
}
else if (component == 2)
{
self.selectedDayRow = row;
}
}
[self.pickViewList reloadComponent:component];
}
#pragma mark -
#pragma mark - UIPickerViewDatasource
- (UIView *)pickerView:(UIPickerView *)pickerView
viewForRow:(NSInteger)row
forComponent:(NSInteger)component
reusingView:(UIView *)reusingView {
// Custom View created for each component
UILabel *pickerLabel = (UILabel *)reusingView;
if (pickerLabel == nil) {
CGRect frame = CGRectMake(0.0, 0.0, 50, 60);
pickerLabel = [[[UILabel alloc] initWithFrame:frame] autorelease];
[pickerLabel setTextAlignment:UITextAlignmentCenter];
[pickerLabel setBackgroundColor:[UIColor clearColor]];
pickerLabel.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:15.0];
pickerLabel.textColor = [UIColor blackColor];
}
if (self.timeType==timeDetail) {//timeDetail
if (component == 0)
{
pickerLabel.text = [self.yearArray objectAtIndex:row]; // Year
}
else if (component == 1)
{
pickerLabel.text = [self.monthArray objectAtIndex:row]; // Month
}
else if (component == 2)
{
pickerLabel.text = [self.daysArray objectAtIndex:row]; // Date
}
else if (component == 3)
{
pickerLabel.text = [self.hoursArray objectAtIndex:row]; // Hours
}
else if (component == 4)
{
pickerLabel.text = [self.minutesArray objectAtIndex:row]; // Mins
}
}else if(self.timeType == timeChinese){//timeChinese
if (component == 0)
{
pickerLabel.text = [self.daysArray objectAtIndex:row]; // Date
}
else if (component == 1)
{
pickerLabel.text = [self.hoursArray objectAtIndex:row]; // Hours
}
else
{
pickerLabel.text = [self.minutesArray objectAtIndex:row]; // Mins
}
}else{//dateDetail
if (component == 0)
{
pickerLabel.text = [self.yearArray objectAtIndex:row]; // Year
}
else if (component == 1)
{
pickerLabel.text = [self.monthArray objectAtIndex:row]; // Month
}
else if (component == 2)
{
pickerLabel.text = [self.daysArray objectAtIndex:row]; // Date
}
}
return pickerLabel;
}
//返回组件数
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
if (self.timeType == timeDetail) {//timeDetail
return 5;
}else if(self.timeType == timeChinese){
return 3;
}else{//dateDetail
return 3;
}
}
// returns the # of rows in each component..
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
if (self.timeType == timeDetail) {//timeDetail
if (component == 0)
{
return [self.yearArray count];
}
else if (component == 1)
{
return [self.monthArray count];
}
else if (component == 2)
{ // day
if (self.selectedMonthRow == 0 || self.selectedMonthRow == 2 || self.selectedMonthRow == 4 || self.selectedMonthRow == 6 || self.selectedMonthRow == 7 || self.selectedMonthRow == 9 || self.selectedMonthRow == 11)
{
return 31;
}
else if (self.selectedMonthRow == 1)
{
int yearint = [[self.yearArray objectAtIndex:self.selectedYearRow]intValue ];
if(((yearint %4==0)&&(yearint %100!=0))||(yearint %400==0)){
return 29;
}
else
{
return 28; // or return 29
}
}
else
{
return 30;
}
}
else if (component == 3)
{ // hour
return 24;
}
else
{ // min
return 60;
}
}else if(self.timeType == timeChinese){//timehinese
if (component == 0)
{ // day
return 3;
}
else if (component == 1)
{ // hour
return 24;
}
else
{ // min
return 60;
}
}else{//dateDetail
if (component == 0)
{
return [self.yearArray count];
}
else if (component == 1)
{
return [self.monthArray count];
}
else
{ // day
if (self.selectedMonthRow == 0 || self.selectedMonthRow == 2 || self.selectedMonthRow == 4 || self.selectedMonthRow == 6 || self.selectedMonthRow == 7 || self.selectedMonthRow == 9 || self.selectedMonthRow == 11)
{
return 31;
}
else if (self.selectedMonthRow == 1)
{
int yearint = [[self.yearArray objectAtIndex:self.selectedYearRow]intValue ];
if(((yearint %4==0)&&(yearint %100!=0))||(yearint %400==0)){
return 29;
}
else
{
return 28; // or return 29
}
}
else
{
return 30;
}
}
}
}
#pragma mark -
#pragma mark - Others
// 选择完成
-(void)actionDone
{
if (self.timeType == timeDetail) {//timeDetail
[self.delegate selectDate:[NSString stringWithFormat:@"%@%@%@ %@%@",[self.yearArray objectAtIndex:[self.pickViewList selectedRowInComponent:0]],[self.monthArray objectAtIndex:[self.pickViewList selectedRowInComponent:1]],[self.daysArray objectAtIndex:[self.pickViewList selectedRowInComponent:2]],[self.hoursArray objectAtIndex:[self.pickViewList selectedRowInComponent:3]],[self.minutesArray objectAtIndex:[self.pickViewList selectedRowInComponent:4]]]];
}else if(self.timeType == timeChinese){//timeChinese
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"yyyy年MM月dd日"];
NSDate *todayDate=[formatter dateFromString:[formatter stringFromDate:[NSDate date]]];
NSTimeInterval secondsPerDay = 24*60*60;
if ([[self.daysArray objectAtIndex:[self.pickViewList selectedRowInComponent:0]] isEqual:@"明天"]) {
todayDate=[NSDate dateWithTimeInterval:secondsPerDay sinceDate:todayDate];
}else if ([[self.daysArray objectAtIndex:[self.pickViewList selectedRowInComponent:0]] isEqual:@"后天"]) {
todayDate=[NSDate dateWithTimeInterval:secondsPerDay*2 sinceDate:todayDate];
}
[self.delegate selectDate:[NSString stringWithFormat:@"%@ %@%@",[formatter stringFromDate:todayDate],[self.hoursArray objectAtIndex:[self.pickViewList selectedRowInComponent:1]],[self.minutesArray objectAtIndex:[self.pickViewList selectedRowInComponent:2]]]];
}else{
[self.delegate selectDate:[NSString stringWithFormat:@"%@%@%@",[self.yearArray objectAtIndex:[self.pickViewList selectedRowInComponent:0]],[self.monthArray objectAtIndex:[self.pickViewList selectedRowInComponent:1]],[self.daysArray objectAtIndex:[self.pickViewList selectedRowInComponent:2]]]];
}
[self hidePickerView];
}
// 取消选择
-(void)actionCancel
{
[self.delegate selectDate:nil];
[self hidePickerView];
}
// UIPicker显示
- (void)showInView:(UIView *)view
{
[UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^(void){
// 添加阴影
UIView *shadowView = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds] autorelease];
shadowView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];
shadowView.userInteractionEnabled = NO;
shadowView.tag = 1024;
[view addSubview:shadowView];
[view bringSubviewToFront:shadowView];
// 添加UIPickerView
[self setFrame:CGRectMake(0, [UIScreen mainScreen].bounds.size.height-self.pickView.frame.size.height, [UIScreen mainScreen].bounds.size.width, self.pickView.frame.size.height)];
[view addSubview:self];
[view bringSubviewToFront:self];
// navigationItem 禁用
UIViewController *viewController = [self viewController];
viewController.navigationItem.leftBarButtonItem.enabled = NO;
viewController.navigationItem.rightBarButtonItem.enabled = NO;
// 除了UIPickerView外 禁用
for (UIView *subView in [view subviews]) {
if (![self isEqual:subView]) {
subView.userInteractionEnabled = NO;
}
}
} completion:^(BOOL isFinished){
}];
}
// UIPicker隐藏
-(void)hidePickerView
{
[UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^(void){
// 去掉阴影,去掉禁用
for (UIView *subView in [[self superview] subviews]) {
if (subView.tag == 1024) {
[subView removeFromSuperview];
}else{
subView.userInteractionEnabled = YES;
}
}
// UIPickerView隐藏
[self setFrame:CGRectMake(0, [UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
// navigationItem可用
UIViewController *viewController = [self viewController];
viewController.navigationItem.leftBarButtonItem.enabled = YES;
viewController.navigationItem.rightBarButtonItem.enabled = YES;
} completion:^(BOOL isFinished){
}];
}
// 通过UIView查找UIViewController
- (UIViewController *)viewController {
UIResponder *responder = self;
while (![responder isKindOfClass:[UIViewController class]]) {
responder = [responder nextResponder];
if (nil == responder) {
break;
}
}
return (UIViewController *)responder;
}
@end
效果