OC 年月日選擇器及年月選擇器的實現
阿新 • • 發佈:2018-11-05
1.建立繼承自UpView這個檢視彈出類的時間選擇檢視類DatePickerView,UpView類的內容參照連結UpView
#import "UpView.h" NS_ASSUME_NONNULL_BEGIN typedef NS_ENUM(NSInteger, DateStyle){ DateStyleDate, DateStyleYearAndMonth }; @protocol DatePickerViewDelegate <NSObject> -(void)didClickSureWithYear:(NSInteger )year AndMonth:(NSInteger )month AndDay:(NSInteger)day; @end @interface DatePickerView : UpView //確定按鈕 @property (nonatomic, strong)UIButton *sureBtn; //取消按鈕 @property (nonatomic, strong)UIButton *cancelBtn; //自定義選擇檢視 @property (nonatomic, strong)UIPickerView *pickerView; //系統選擇檢視 @property (nonatomic, strong)UIDatePicker *datePicker; //選擇的時間模式 @property (nonatomic, assign)DateStyle dateStyle; //年,月,日 @property (nonatomic, assign)NSInteger year; @property (nonatomic, assign)NSInteger month; @property (nonatomic, assign)NSInteger day; @property(nonatomic, weak)id<DatePickerViewDelegate>delegate; @end
#import "DatePickerView.h" @interface DatePickerView()<UIPickerViewDelegate,UIPickerViewDataSource> @end @implementation DatePickerView /* // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { // Drawing code } */ - (instancetype)init { self = [super init]; return self; } #pragma mark - 建立內容檢視 - (void)setContentView { //建立按鈕 [self.contentView addSubview:self.sureBtn]; [self.contentView addSubview:self.cancelBtn]; //建立選擇器 if (self.dateStyle == DateStyleDate) { [self.contentView addSubview:self.datePicker]; }else if (self.dateStyle == DateStyleYearAndMonth){ [self.contentView addSubview:self.pickerView]; } } #pragma mark - 自定義選擇檢視 - (UIPickerView *)pickerView { if (!_pickerView) { _pickerView = [[UIPickerView alloc]initWithFrame:CGRectMake(0, 40, UI_SCREEN_WIDTH, self.contentHeight - 40)]; _pickerView.dataSource = self; _pickerView.delegate = self; [_pickerView selectRow:100 inComponent:0 animated:YES]; [_pickerView selectRow:[self getYearAndMonthAndDayFrom:[NSDate date]].month - 1 inComponent:1 animated:YES]; } return _pickerView; } #pragma mark - 系統時間檢視 - (UIDatePicker *)datePicker { if (!_datePicker) { //系統時間選擇 _datePicker = [[UIDatePicker alloc]initWithFrame:CGRectMake(0, 40, UI_SCREEN_WIDTH, self.contentHeight - 40)]; _datePicker.datePickerMode = UIDatePickerModeDate; _datePicker.locale = [[NSLocale alloc]initWithLocaleIdentifier:@"zh_CN"]; _datePicker.date = [NSDate date]; [_datePicker addTarget:self action:@selector(dateChanged:) forControlEvents:UIControlEventValueChanged]; } return _datePicker; } #pragma mark - 系統時間選擇器變化 - (void)dateChanged:(UIDatePicker *)datePicker{ self.year = [self getYearAndMonthAndDayFrom:self.datePicker.date].year; self.month = [self getYearAndMonthAndDayFrom:self.datePicker.date].month; self.day = [self getYearAndMonthAndDayFrom:self.datePicker.date].day; } #pragma mark - UIPickerViewDelegate,UIPickerViewDataSource - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 2; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { if (component == 0) { //年分取當前年份上下100年 return 201; }else { //月份為12個月 return 12; } } - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { if (component == 0) { NSInteger currentYear = [self getYearAndMonthAndDayFrom:[NSDate date]].year; return [NSString stringWithFormat:@"%ld年",currentYear - (100 - row)]; }else { return [NSString stringWithFormat:@"%ld月",row + 1]; } } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { self.day = 0; if (component == 0) { NSInteger currentYear = [self getYearAndMonthAndDayFrom:[NSDate date]].year; self.year = currentYear - (100-row); }else { self.month = row + 1; } } #pragma mark - 確定按鈕 - (UIButton *)sureBtn { if (!_sureBtn) { _sureBtn = [[UIButton alloc]initWithFrame:CGRectMake(UI_SCREEN_WIDTH - 60, 0, 60, 40)]; [_sureBtn setTitle:@"確定" forState:UIControlStateNormal]; [_sureBtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; [_sureBtn addTarget:self action:@selector(sureAction) forControlEvents:UIControlEventTouchUpInside]; } return _sureBtn; } #pragma mark - 取消按鈕 - (UIButton *)cancelBtn { if (!_cancelBtn) { _cancelBtn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 60, 40)]; [_cancelBtn setTitle:@"取消" forState:UIControlStateNormal]; [_cancelBtn setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; [_cancelBtn addTarget:self action:@selector(dismiss) forControlEvents:UIControlEventTouchUpInside]; } return _cancelBtn; } #pragma mark -確定選擇 - (void)sureAction { if ([self.delegate respondsToSelector:@selector(didClickSureWithYear:AndMonth:AndDay:)]) { [self.delegate didClickSureWithYear:self.year AndMonth:self.month AndDay:self.day]; [self dismiss]; } } #pragma mark -重寫檢視出現的方法 - (void)show { if (!self.contentHeight) { self.contentHeight = 210.f; } [self setContentView]; [[self lastWidow] addSubview:self]; [UIView animateWithDuration:0.3 animations:^{ [self.contentView setFrame:CGRectMake(0, UI_SCREEN_HEIGHT - HOME_INDICATOR_HEIGHT - self.contentHeight, UI_SCREEN_WIDTH, self.contentHeight)]; }completion:^(BOOL finished) { if (self.dateStyle == DateStyleDate) { self.year = [self getYearAndMonthAndDayFrom:self.datePicker.date].year; self.month = [self getYearAndMonthAndDayFrom:self.datePicker.date].month; self.day = [self getYearAndMonthAndDayFrom:self.datePicker.date].day; }else if (self.dateStyle == DateStyleYearAndMonth){ self.year = [self getYearAndMonthAndDayFrom:[NSDate date]].year; self.month = [self getYearAndMonthAndDayFrom:[NSDate date]].month; self.day = 0; } }]; } #pragma mark - 獲取最上層window - (UIWindow *)lastWidow{ NSArray *windows = [UIApplication sharedApplication].windows; for (UIWindow *window in [windows reverseObjectEnumerator]) { if ([window isKindOfClass:[UIWindow class]] && CGRectEqualToRect(window.bounds, [UIScreen mainScreen].bounds)) { return window; } } return [UIApplication sharedApplication].keyWindow; } #pragma mark - 根據date獲取年月日 - (NSDateComponents *)getYearAndMonthAndDayFrom:(NSDate *)date { NSCalendar *cal = [NSCalendar currentCalendar]; NSDateComponents *d = [cal components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:self.datePicker.date]; return d; } @end
2.年月日選擇器使用方法:
DatePickerView *dateV = [[DatePickerView alloc]init];
dateV.contentHeight = 300.0f;
dateV.dateStyle = DateStyleDate;
dateV.delegate = self;
[dateV show];
3.年月選擇器實現:
DatePickerView *dateV = [[DatePickerView alloc]init]; dateV.contentHeight = 300.0f; dateV.dateStyle = DateStyleYearAndMonth; dateV.delegate = self; [dateV show];
4.代理
#pragma mark - DatePickerViewDelegate
- (void)didClickSureWithYear:(NSInteger)year AndMonth:(NSInteger)month AndDay:(NSInteger)day {
NSLog(@"%ld,%ld,%ld",year,month,day);
}