以前在网上下了个时间选择器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