1. 程式人生 > >OC 年月日選擇器及年月選擇器的實現

OC 年月日選擇器及年月選擇器的實現

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);
}