Files
OrderScheduling/Pods/BRPickerView/BRPickerView/DatePickerView/BRDatePickerView.m
DDIsFriend 3b9b465d22 update
2023-09-04 16:39:06 +08:00

1966 lines
85 KiB
Objective-C
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// BRDatePickerView.m
// BRPickerViewDemo
//
// Created by renbo on 2017/8/11.
// Copyright © 2017 irenb. All rights reserved.
//
// 最新代码下载地址https://github.com/91renb/BRPickerView
#import "BRDatePickerView.h"
#import "NSBundle+BRPickerView.h"
#import "BRDatePickerView+BR.h"
/// 日期选择器的类型
typedef NS_ENUM(NSInteger, BRDatePickerStyle) {
BRDatePickerStyleSystem, // 系统样式:使用 UIDatePicker
BRDatePickerStyleCustom // 自定义样式:使用 UIPickerView
};
@interface BRDatePickerView ()<UIPickerViewDataSource, UIPickerViewDelegate>
{
UIDatePickerMode _datePickerMode;
UIView *_containerView;
BOOL _isAdjustSelectRow; // 设置minDate时调整日期联动的选择(解决日期选择器联动不正确的问题)
}
/** 日期选择器1 */
@property (nonatomic, strong) UIDatePicker *datePicker;
/** 日期选择器2 */
@property (nonatomic, strong) UIPickerView *pickerView;
/// 日期存储数组
@property(nonatomic, copy) NSArray *yearArr;
@property(nonatomic, copy) NSArray *monthArr;
@property(nonatomic, copy) NSArray *dayArr;
@property(nonatomic, copy) NSArray *hourArr;
@property(nonatomic, copy) NSArray *minuteArr;
@property(nonatomic, copy) NSArray *secondArr;
/// 月周、年周、季度数组
@property(nonatomic, copy) NSArray *monthWeekArr;
@property(nonatomic, copy) NSArray *yearWeekArr;
@property(nonatomic, copy) NSArray *quarterArr;
/// 记录 年、月、日、时、分、秒 当前选择的位置
@property(nonatomic, assign) NSInteger yearIndex;
@property(nonatomic, assign) NSInteger monthIndex;
@property(nonatomic, assign) NSInteger dayIndex;
@property(nonatomic, assign) NSInteger hourIndex;
@property(nonatomic, assign) NSInteger minuteIndex;
@property(nonatomic, assign) NSInteger secondIndex;
/// 月周、年周、季度 当前选择的位置
@property(nonatomic, assign) NSInteger monthWeekIndex;
@property(nonatomic, assign) NSInteger yearWeekIndex;
@property(nonatomic, assign) NSInteger quarterIndex;
// 记录选择的值
@property (nonatomic, strong) NSDate *mSelectDate;
@property (nonatomic, copy) NSString *mSelectValue;
/** 日期选择器的类型 */
@property (nonatomic, assign) BRDatePickerStyle style;
/** 日期的格式 */
@property (nonatomic, copy) NSString *dateFormatter;
/** 单位数组 */
@property (nonatomic, copy) NSArray *unitArr;
/** 单位label数组 */
@property (nonatomic, copy) NSArray <UILabel *> *unitLabelArr;
@end
@implementation BRDatePickerView
#pragma mark - 1.显示日期选择器
+ (void)showDatePickerWithMode:(BRDatePickerMode)mode
title:(NSString *)title
selectValue:(NSString *)selectValue
resultBlock:(BRDateResultBlock)resultBlock {
[self showDatePickerWithMode:mode title:title selectValue:selectValue minDate:nil maxDate:nil isAutoSelect:NO resultBlock:resultBlock];
}
#pragma mark - 2.显示日期选择器
+ (void)showDatePickerWithMode:(BRDatePickerMode)mode
title:(NSString *)title
selectValue:(NSString *)selectValue
isAutoSelect:(BOOL)isAutoSelect
resultBlock:(BRDateResultBlock)resultBlock {
[self showDatePickerWithMode:mode title:title selectValue:selectValue minDate:nil maxDate:nil isAutoSelect:isAutoSelect resultBlock:resultBlock];
}
#pragma mark - 3.显示日期选择器
+ (void)showDatePickerWithMode:(BRDatePickerMode)mode
title:(NSString *)title
selectValue:(NSString *)selectValue
minDate:(NSDate *)minDate
maxDate:(NSDate *)maxDate
isAutoSelect:(BOOL)isAutoSelect
resultBlock:(BRDateResultBlock)resultBlock {
[self showDatePickerWithMode:mode title:title selectValue:selectValue minDate:nil maxDate:nil isAutoSelect:isAutoSelect resultBlock:resultBlock resultRangeBlock:nil];
}
#pragma mark - 4.显示日期选择器
+ (void)showDatePickerWithMode:(BRDatePickerMode)mode
title:(NSString *)title
selectValue:(NSString *)selectValue
minDate:(NSDate *)minDate
maxDate:(NSDate *)maxDate
isAutoSelect:(BOOL)isAutoSelect
resultBlock:(BRDateResultBlock)resultBlock
resultRangeBlock:(BRDateResultRangeBlock)resultRangeBlock {
// 创建日期选择器
BRDatePickerView *datePickerView = [[BRDatePickerView alloc]init];
datePickerView.pickerMode = mode;
datePickerView.title = title;
datePickerView.selectValue = selectValue;
datePickerView.minDate = minDate;
datePickerView.maxDate = maxDate;
datePickerView.isAutoSelect = isAutoSelect;
datePickerView.resultBlock = resultBlock;
datePickerView.resultRangeBlock = resultRangeBlock;
// 显示
[datePickerView show];
}
#pragma mark - 初始化日期选择器
- (instancetype)initWithPickerMode:(BRDatePickerMode)pickerMode {
if (self = [super init]) {
self.pickerMode = pickerMode;
}
return self;
}
#pragma mark - 处理选择器数据
- (void)handlerPickerData {
// 1.最小日期限制
self.minDate = [self handlerMinDate:self.minDate];
// 2.最大日期限制
self.maxDate = [self handlerMaxDate:self.maxDate];
BOOL minMoreThanMax = [self br_compareDate:self.minDate targetDate:self.maxDate dateFormat:self.dateFormatter] == NSOrderedDescending;
NSAssert(!minMoreThanMax, @"最小日期不能大于最大日期!");
if (minMoreThanMax) {
// 如果最小日期大于了最大日期,就忽略两个值
self.minDate = [NSDate distantPast]; // 0000-12-30 00:00:00 +0000
self.maxDate = [NSDate distantFuture]; // 4001-01-01 00:00:00 +0000
}
// 3.默认选中的日期
self.mSelectDate = [self handlerSelectDate:self.selectDate dateFormat:self.dateFormatter];
// 4.设置选择器日期数据
if (self.style == BRDatePickerStyleCustom) {
[self setupDateArray];
}
if (self.selectValue && ([self.selectValue isEqualToString:self.lastRowContent] || [self.selectValue isEqualToString:self.firstRowContent])) {
self.mSelectDate = self.addToNow ? [NSDate date] : nil;
} else {
if (self.pickerMode == BRDatePickerModeYMDH && self.isShowAMAndPM) {
self.hourIndex = (self.mSelectDate.br_hour < 12 ? 0 : 1);
self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d-%02d %@", (int)self.mSelectDate.br_year, (int)self.mSelectDate.br_month, (int)self.mSelectDate.br_day, [self getHourString]];
} else {
self.mSelectValue = [self br_stringFromDate:self.mSelectDate dateFormat:self.dateFormatter];
}
}
}
#pragma mark - 设置默认日期数据源
- (void)setupDateArray {
if (self.selectValue && ([self.selectValue isEqualToString:self.lastRowContent] || [self.selectValue isEqualToString:self.firstRowContent])) {
switch (self.pickerMode) {
case BRDatePickerModeYMDHMS:
case BRDatePickerModeYMDHM:
case BRDatePickerModeYMDH:
case BRDatePickerModeYMD:
case BRDatePickerModeYM:
case BRDatePickerModeY:
{
self.yearArr = [self getYearArr];
self.monthArr = nil;
self.dayArr = nil;
self.hourArr = nil;
self.minuteArr = nil;
self.secondArr = nil;
self.monthWeekArr = nil;
self.yearWeekArr = nil;
self.quarterArr = nil;
}
break;
case BRDatePickerModeMDHM:
case BRDatePickerModeMD:
{
self.yearArr = [self getYearArr];
self.monthArr = [self getMonthArr:self.mSelectDate.br_year];
self.dayArr = nil;
self.hourArr = nil;
self.minuteArr = nil;
self.secondArr = nil;
self.monthWeekArr = nil;
self.yearWeekArr = nil;
self.quarterArr = nil;
}
break;
case BRDatePickerModeHMS:
case BRDatePickerModeHM:
{
self.yearArr = [self getYearArr];
self.monthArr = [self getMonthArr:self.mSelectDate.br_year];
self.dayArr = [self getDayArr:self.mSelectDate.br_year month:self.mSelectDate.br_month];
self.hourArr = [self getHourArr:self.mSelectDate.br_year month:self.mSelectDate.br_month day:self.mSelectDate.br_day];
self.minuteArr = nil;
self.secondArr = nil;
self.monthWeekArr = nil;
self.yearWeekArr = nil;
self.quarterArr = nil;
}
break;
case BRDatePickerModeMS:
{
self.yearArr = [self getYearArr];
self.monthArr = [self getMonthArr:self.mSelectDate.br_year];
self.dayArr = [self getDayArr:self.mSelectDate.br_year month:self.mSelectDate.br_month];
self.hourArr = [self getHourArr:self.mSelectDate.br_year month:self.mSelectDate.br_month day:self.mSelectDate.br_day];
self.minuteArr = [self getMinuteArr:self.mSelectDate.br_year month:self.mSelectDate.br_month day:self.mSelectDate.br_day hour:self.mSelectDate.br_hour];
self.secondArr = nil;
self.monthWeekArr = nil;
self.yearWeekArr = nil;
self.quarterArr = nil;
}
break;
case BRDatePickerModeYMW:
{
self.yearArr = [self getYearArr];
self.monthArr = [self getMonthArr:self.mSelectDate.br_year];
self.monthWeekArr = [self getMonthWeekArr:self.mSelectDate.br_year month:self.mSelectDate.br_month];
self.yearWeekArr = nil;
self.quarterArr = nil;
self.dayArr = nil;
self.hourArr = nil;
self.minuteArr = nil;
self.secondArr = nil;
}
break;
case BRDatePickerModeYW:
{
self.yearArr = [self getYearArr];
self.monthArr = nil;
self.monthWeekArr = nil;
self.yearWeekArr = [self getYearWeekArr:self.mSelectDate.br_year];
self.quarterArr = nil;
self.dayArr = nil;
self.hourArr = nil;
self.minuteArr = nil;
self.secondArr = nil;
}
break;
case BRDatePickerModeYQ:
{
self.yearArr = [self getYearArr];
self.monthArr = nil;
self.monthWeekArr = nil;
self.yearWeekArr = nil;
self.quarterArr = [self getQuarterArr:self.mSelectDate.br_year];;
self.dayArr = nil;
self.hourArr = nil;
self.minuteArr = nil;
self.secondArr = nil;
}
break;
default:
break;
}
} else {
self.yearArr = [self getYearArr];
self.monthArr = [self getMonthArr:self.mSelectDate.br_year];
self.dayArr = [self getDayArr:self.mSelectDate.br_year month:self.mSelectDate.br_month];
self.hourArr = [self getHourArr:self.mSelectDate.br_year month:self.mSelectDate.br_month day:self.mSelectDate.br_day];
self.minuteArr = [self getMinuteArr:self.mSelectDate.br_year month:self.mSelectDate.br_month day:self.mSelectDate.br_day hour:self.mSelectDate.br_hour];
self.secondArr = [self getSecondArr:self.mSelectDate.br_year month:self.mSelectDate.br_month day:self.mSelectDate.br_day hour:self.mSelectDate.br_hour minute:self.mSelectDate.br_minute];
self.monthWeekArr = [self getMonthWeekArr:self.mSelectDate.br_year month:self.mSelectDate.br_month];
self.yearWeekArr = [self getYearWeekArr:self.mSelectDate.br_year];
self.quarterArr = [self getQuarterArr:self.mSelectDate.br_year];
}
}
- (void)setupDateFormatter:(BRDatePickerMode)mode {
switch (mode) {
case BRDatePickerModeDate:
{
self.dateFormatter = @"yyyy-MM-dd";
self.style = BRDatePickerStyleSystem;
_datePickerMode = UIDatePickerModeDate;
}
break;
case BRDatePickerModeDateAndTime:
{
self.dateFormatter = @"yyyy-MM-dd HH:mm";
self.style = BRDatePickerStyleSystem;
_datePickerMode = UIDatePickerModeDateAndTime;
}
break;
case BRDatePickerModeTime:
{
self.dateFormatter = @"HH:mm";
self.style = BRDatePickerStyleSystem;
_datePickerMode = UIDatePickerModeTime;
}
break;
case BRDatePickerModeCountDownTimer:
{
self.dateFormatter = @"HH:mm";
self.style = BRDatePickerStyleSystem;
_datePickerMode = UIDatePickerModeCountDownTimer;
}
break;
case BRDatePickerModeYMDHMS:
{
self.dateFormatter = @"yyyy-MM-dd HH:mm:ss";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getYearUnit], [self getMonthUnit], [self getDayUnit], [self getHourUnit], [self getMinuteUnit], [self getSecondUnit]];
}
break;
case BRDatePickerModeYMDHM:
{
self.dateFormatter = @"yyyy-MM-dd HH:mm";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getYearUnit], [self getMonthUnit], [self getDayUnit], [self getHourUnit], [self getMinuteUnit]];
}
break;
case BRDatePickerModeYMDH:
{
self.dateFormatter = @"yyyy-MM-dd HH";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getYearUnit], [self getMonthUnit], [self getDayUnit], self.pickerMode == BRDatePickerModeYMDH && self.isShowAMAndPM ? @"" : [self getHourUnit]];
}
break;
case BRDatePickerModeMDHM:
{
self.dateFormatter = @"MM-dd HH:mm";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getMonthUnit], [self getDayUnit], [self getHourUnit], [self getMinuteUnit]];
}
break;
case BRDatePickerModeYMD:
{
self.dateFormatter = @"yyyy-MM-dd";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getYearUnit], [self getMonthUnit], [self getDayUnit]];
}
break;
case BRDatePickerModeYM:
{
self.dateFormatter = @"yyyy-MM";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getYearUnit], [self getMonthUnit]];
}
break;
case BRDatePickerModeY:
{
self.dateFormatter = @"yyyy";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getYearUnit]];
}
break;
case BRDatePickerModeMD:
{
self.dateFormatter = @"MM-dd";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getMonthUnit], [self getDayUnit]];
}
break;
case BRDatePickerModeHMS:
{
self.dateFormatter = @"HH:mm:ss";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getHourUnit], [self getMinuteUnit], [self getSecondUnit]];
}
break;
case BRDatePickerModeHM:
{
self.dateFormatter = @"HH:mm";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getHourUnit], [self getMinuteUnit]];
}
break;
case BRDatePickerModeMS:
{
self.dateFormatter = @"mm:ss";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getMinuteUnit], [self getSecondUnit]];
}
break;
case BRDatePickerModeYMW:
{
self.dateFormatter = @"yyyy-MM-WW";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getYearUnit], [self getMonthUnit], [self getWeekUnit]];
}
break;
case BRDatePickerModeYW:
{
self.dateFormatter = @"yyyy-ww";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getYearUnit], [self getWeekUnit]];
}
break;
case BRDatePickerModeYQ:
{
self.dateFormatter = @"yyyy-qq";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getYearUnit], [self getQuarterUnit]];
}
break;
default:
break;
}
}
#pragma mark - 更新日期数据源数组
- (void)reloadDateArrayWithUpdateMonth:(BOOL)updateMonth updateDay:(BOOL)updateDay updateHour:(BOOL)updateHour updateMinute:(BOOL)updateMinute updateSecond:(BOOL)updateSecond {
[self reloadDateArrayWithUpdateMonth:updateMonth updateDay:updateDay updateHour:updateHour updateMinute:updateMinute updateSecond:NO updateWeekOfMonth:NO updateWeekOfYear:NO updateQuarter:NO];
}
- (void)reloadDateArrayWithUpdateMonth:(BOOL)updateMonth updateDay:(BOOL)updateDay updateHour:(BOOL)updateHour updateMinute:(BOOL)updateMinute updateSecond:(BOOL)updateSecond
updateWeekOfMonth:(BOOL)updateWeekOfMonth updateWeekOfYear:(BOOL)updateWeekOfYear updateQuarter:(BOOL)updateQuarter {
_isAdjustSelectRow = NO;
// 1.更新 monthArr
if (self.yearArr.count == 0) {
return;
}
NSString *yearString = [self getYearString];
if ((self.lastRowContent && [yearString isEqualToString:self.lastRowContent]) || (self.firstRowContent && [yearString isEqualToString:self.firstRowContent])) {
self.monthArr = nil;
self.dayArr = nil;
self.hourArr = nil;
self.minuteArr = nil;
self.secondArr = nil;
self.monthWeekArr = nil;
self.yearWeekArr = nil;
self.quarterArr = nil;
return;
}
if (updateMonth) {
NSString *lastSelectMonth = [self getMDHMSNumber:self.mSelectDate.br_month];
self.monthArr = [self getMonthArr:[yearString integerValue]];
if (self.mSelectDate) {
if ([self.monthArr containsObject:lastSelectMonth]) {
NSInteger monthIndex = [self.monthArr indexOfObject:lastSelectMonth];
if (monthIndex != self.monthIndex) {
_isAdjustSelectRow = YES;
self.monthIndex = monthIndex;
}
} else {
_isAdjustSelectRow = YES;
self.monthIndex = ([lastSelectMonth intValue] < [self.monthArr.firstObject intValue]) ? 0 : (self.monthArr.count - 1);
}
}
}
// 1/1.更新 yearWeekArr
if (updateWeekOfYear) {
NSString *lastSelectWeekOfYear = [self getMDHMSNumber:self.mSelectDate.br_yearWeek];
self.yearWeekArr = [self getYearWeekArr:[yearString integerValue]];
if (self.mSelectDate) {
if ([self.yearWeekArr containsObject:lastSelectWeekOfYear]) {
NSInteger yearWeekIndex = [self.yearWeekArr indexOfObject:lastSelectWeekOfYear];
if (yearWeekIndex != self.yearWeekIndex) {
_isAdjustSelectRow = YES;
self.monthIndex = yearWeekIndex;
}
} else {
_isAdjustSelectRow = YES;
self.yearWeekIndex = ([lastSelectWeekOfYear intValue] < [self.yearWeekArr.firstObject intValue]) ? 0 : (self.yearWeekArr.count - 1);
}
}
}
// 1/1.更新 quarterArr
if (updateQuarter) {
NSString *lastSelectQuarter = [self getMDHMSNumber:self.mSelectDate.br_quarter];
self.quarterArr = [self getQuarterArr:[yearString integerValue]];
if (self.mSelectDate) {
if ([self.quarterArr containsObject:lastSelectQuarter]) {
NSInteger quarterIndex = [self.quarterArr indexOfObject:lastSelectQuarter];
if (quarterIndex != self.quarterIndex) {
_isAdjustSelectRow = YES;
self.quarterIndex = quarterIndex;
}
} else {
_isAdjustSelectRow = YES;
self.quarterIndex = ([lastSelectQuarter intValue] < [self.quarterArr.firstObject intValue]) ? 0 : (self.quarterArr.count - 1);
}
}
}
// 2.更新 dayArr
if (self.monthArr.count == 0) {
return;
}
NSString *monthString = [self getMonthString];
if ((self.lastRowContent && [monthString isEqualToString:self.lastRowContent]) || (self.firstRowContent && [monthString isEqualToString:self.firstRowContent])) {
self.dayArr = nil;
self.hourArr = nil;
self.minuteArr = nil;
self.secondArr = nil;
self.monthWeekArr = nil;
return;
}
if (updateDay) {
NSString *lastSelectDay = [self getMDHMSNumber:self.mSelectDate.br_day];
self.dayArr = [self getDayArr:[yearString integerValue] month:[monthString integerValue]];
if (self.mSelectDate) {
if ([self.dayArr containsObject:lastSelectDay]) {
NSInteger dayIndex = [self.dayArr indexOfObject:lastSelectDay];
if (dayIndex != self.dayIndex) {
_isAdjustSelectRow = YES;
self.dayIndex = dayIndex;
}
} else {
_isAdjustSelectRow = YES;
self.dayIndex = ([lastSelectDay intValue] < [self.dayArr.firstObject intValue]) ? 0 : (self.dayArr.count - 1);
}
}
}
// 2/1.更新 monthWeekArr
if (updateWeekOfMonth) {
NSString *lastWeekOfMonth = [self getMDHMSNumber:self.mSelectDate.br_monthWeek];
self.monthWeekArr = [self getMonthWeekArr:[yearString integerValue] month:[monthString integerValue]];
if (self.mSelectDate) {
if ([self.monthWeekArr containsObject:lastWeekOfMonth]) {
NSInteger monthWeekIndex = [self.monthWeekArr indexOfObject:lastWeekOfMonth];
if (monthWeekIndex != self.monthWeekIndex) {
_isAdjustSelectRow = YES;
self.monthWeekIndex = monthWeekIndex;
}
} else {
_isAdjustSelectRow = YES;
self.monthWeekIndex = ([lastWeekOfMonth intValue] < [self.monthWeekArr.firstObject intValue]) ? 0 : (self.monthWeekArr.count - 1);
}
}
}
// 3.更新 hourArr
if (self.dayArr.count == 0) {
return;
}
NSInteger day = [[self getDayString] integerValue];
if (updateHour) {
NSString *lastSelectHour = [self getMDHMSNumber:self.mSelectDate.br_hour];
self.hourArr = [self getHourArr:[yearString integerValue] month:[monthString integerValue] day:day];
if (self.mSelectDate) {
if ([self.hourArr containsObject:lastSelectHour]) {
NSInteger hourIndex = [self.hourArr indexOfObject:lastSelectHour];
if (hourIndex != self.hourIndex) {
_isAdjustSelectRow = YES;
self.hourIndex = hourIndex;
}
} else {
_isAdjustSelectRow = YES;
self.hourIndex = ([lastSelectHour intValue] < [self.hourArr.firstObject intValue]) ? 0 : (self.hourArr.count - 1);
}
}
}
// 4.更新 minuteArr
if (self.hourArr.count == 0) {
return;
}
NSString *hourString = [self getHourString];
if ((self.lastRowContent && [hourString isEqualToString:self.lastRowContent]) || (self.firstRowContent && [hourString isEqualToString:self.firstRowContent])) {
self.minuteArr = nil;
self.secondArr = nil;
return;
}
if (updateMinute) {
NSString *lastSelectMinute = [self getMDHMSNumber:self.mSelectDate.br_minute];
self.minuteArr = [self getMinuteArr:[yearString integerValue] month:[monthString integerValue] day:day hour:[hourString integerValue]];
if (self.mSelectDate) {
if ([self.minuteArr containsObject:lastSelectMinute]) {
NSInteger minuteIndex = [self.minuteArr indexOfObject:lastSelectMinute];
if (minuteIndex != self.minuteIndex) {
_isAdjustSelectRow = YES;
self.minuteIndex = minuteIndex;
}
} else {
_isAdjustSelectRow = YES;
self.minuteIndex = ([lastSelectMinute intValue] < [self.minuteArr.firstObject intValue]) ? 0 : (self.minuteArr.count - 1);
}
}
}
// 5.更新 secondArr
if (self.minuteArr.count == 0) {
return;
}
NSString *minuteString = [self getMinuteString];
if ((self.lastRowContent && [minuteString isEqualToString:self.lastRowContent]) || (self.firstRowContent && [minuteString isEqualToString:self.firstRowContent])) {
self.secondArr = nil;
return;
}
if (updateSecond) {
NSString *lastSelectSecond = [self getMDHMSNumber:self.mSelectDate.br_second];
self.secondArr = [self getSecondArr:[yearString integerValue] month:[monthString integerValue] day:day hour:[hourString integerValue] minute:[minuteString integerValue]];
if (self.mSelectDate) {
if ([self.secondArr containsObject:lastSelectSecond]) {
NSInteger secondIndex = [self.secondArr indexOfObject:lastSelectSecond];
if (secondIndex != self.secondIndex) {
_isAdjustSelectRow = YES;
self.secondIndex = secondIndex;
}
} else {
_isAdjustSelectRow = YES;
self.secondIndex = ([lastSelectSecond intValue] < [self.secondArr.firstObject intValue]) ? 0 : (self.secondArr.count - 1);
}
}
}
}
#pragma mark - 滚动到指定日期的位置(更新选择的索引)
- (void)scrollToSelectDate:(NSDate *)selectDate animated:(BOOL)animated {
self.yearIndex = [self getIndexWithArray:self.yearArr object:[self getYearNumber:selectDate.br_year]];
self.monthIndex = [self getIndexWithArray:self.monthArr object:[self getMDHMSNumber:selectDate.br_month]];
self.dayIndex = [self getIndexWithArray:self.dayArr object:[self getMDHMSNumber:selectDate.br_day]];
if (self.pickerMode == BRDatePickerModeYMDH && self.isShowAMAndPM) {
self.hourIndex = selectDate.br_hour < 12 ? 0 : 1;
} else {
self.hourIndex = [self getIndexWithArray:self.hourArr object:[self getMDHMSNumber:selectDate.br_hour]];
}
self.minuteIndex = [self getIndexWithArray:self.minuteArr object:[self getMDHMSNumber:selectDate.br_minute]];
self.secondIndex = [self getIndexWithArray:self.secondArr object:[self getMDHMSNumber:selectDate.br_second]];
NSArray *indexArr = nil;
if (self.pickerMode == BRDatePickerModeYMDHMS) {
indexArr = @[@(self.yearIndex), @(self.monthIndex), @(self.dayIndex), @(self.hourIndex), @(self.minuteIndex), @(self.secondIndex)];
} else if (self.pickerMode == BRDatePickerModeYMDHM) {
indexArr = @[@(self.yearIndex), @(self.monthIndex), @(self.dayIndex), @(self.hourIndex), @(self.minuteIndex)];
} else if (self.pickerMode == BRDatePickerModeYMDH) {
indexArr = @[@(self.yearIndex), @(self.monthIndex), @(self.dayIndex), @(self.hourIndex)];
} else if (self.pickerMode == BRDatePickerModeMDHM) {
indexArr = @[@(self.monthIndex), @(self.dayIndex), @(self.hourIndex), @(self.minuteIndex)];
} else if (self.pickerMode == BRDatePickerModeYMD) {
if ([self.pickerStyle.language hasPrefix:@"zh"]) {
indexArr = @[@(self.yearIndex), @(self.monthIndex), @(self.dayIndex)];
} else {
indexArr = @[@(self.dayIndex), @(self.monthIndex), @(self.yearIndex)];
}
} else if (self.pickerMode == BRDatePickerModeYM) {
if ([self.pickerStyle.language hasPrefix:@"zh"]) {
indexArr = @[@(self.yearIndex), @(self.monthIndex)];
} else {
indexArr = @[@(self.monthIndex), @(self.yearIndex)];
}
} else if (self.pickerMode == BRDatePickerModeY) {
indexArr = @[@(self.yearIndex)];
} else if (self.pickerMode == BRDatePickerModeMD) {
indexArr = @[@(self.monthIndex), @(self.dayIndex)];
} else if (self.pickerMode == BRDatePickerModeHMS) {
indexArr = @[@(self.hourIndex), @(self.minuteIndex), @(self.secondIndex)];
} else if (self.pickerMode == BRDatePickerModeHM) {
indexArr = @[@(self.hourIndex), @(self.minuteIndex)];
} else if (self.pickerMode == BRDatePickerModeMS) {
indexArr = @[@(self.minuteIndex), @(self.secondIndex)];
} else if (self.pickerMode == BRDatePickerModeYMW) {
indexArr = @[@(self.yearIndex), @(self.monthIndex), @(self.monthWeekIndex)];
} else if (self.pickerMode == BRDatePickerModeYW) {
indexArr = @[@(self.yearIndex), @(self.yearWeekIndex)];
} else if (self.pickerMode == BRDatePickerModeYQ) {
indexArr = @[@(self.yearIndex), @(self.quarterIndex)];
}
if (!indexArr) return;
for (NSInteger i = 0; i < indexArr.count; i++) {
[self.pickerView selectRow:[indexArr[i] integerValue] inComponent:i animated:animated];
}
}
#pragma mark - 滚动到【自定义字符串】的位置
- (void)scrollToCustomString:(BOOL)animated {
switch (self.pickerMode) {
case BRDatePickerModeYMDHMS:
case BRDatePickerModeYMDHM:
case BRDatePickerModeYMDH:
case BRDatePickerModeYMD:
case BRDatePickerModeYM:
case BRDatePickerModeY:
case BRDatePickerModeYMW:
case BRDatePickerModeYW:
case BRDatePickerModeYQ:
{
NSInteger yearIndex = ([self.selectValue isEqualToString:self.lastRowContent] && self.yearArr.count > 0) ? self.yearArr.count - 1 : 0;
NSInteger component = 0;
if ((self.pickerMode == BRDatePickerModeYMD || self.pickerMode == BRDatePickerModeYMW) && ![self.pickerStyle.language hasPrefix:@"zh"]) {
component = 2;
} else if ((self.pickerMode == BRDatePickerModeYM || self.pickerMode == BRDatePickerModeYQ) && ![self.pickerStyle.language hasPrefix:@"zh"]) {
component = 1;
}
[self.pickerView selectRow:yearIndex inComponent:component animated:animated];
}
break;
case BRDatePickerModeMDHM:
case BRDatePickerModeMD:
{
NSInteger monthIndex = ([self.selectValue isEqualToString:self.lastRowContent] && self.monthArr.count > 0) ? self.monthArr.count - 1 : 0;
[self.pickerView selectRow:monthIndex inComponent:0 animated:animated];
}
break;
case BRDatePickerModeHMS:
case BRDatePickerModeHM:
{
NSInteger hourIndex = ([self.selectValue isEqualToString:self.lastRowContent] && self.hourArr.count > 0) ? self.hourArr.count - 1 : 0;
[self.pickerView selectRow:hourIndex inComponent:0 animated:animated];
}
break;
case BRDatePickerModeMS:
{
NSInteger minuteIndex = ([self.selectValue isEqualToString:self.lastRowContent] && self.minuteArr.count > 0) ? self.minuteArr.count - 1 : 0;
[self.pickerView selectRow:minuteIndex inComponent:0 animated:animated];
}
break;
default:
break;
}
}
#pragma mark - 日期选择器1
- (UIDatePicker *)datePicker {
if (!_datePicker) {
CGFloat pickerHeaderViewHeight = self.pickerHeaderView ? self.pickerHeaderView.bounds.size.height : 0;
_datePicker = [[UIDatePicker alloc]initWithFrame:CGRectMake(0, self.pickerStyle.titleBarHeight + pickerHeaderViewHeight, self.keyView.bounds.size.width, self.pickerStyle.pickerHeight)];
_datePicker.backgroundColor = self.pickerStyle.pickerColor;
_datePicker.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth;
// 滚动改变值的响应事件
[_datePicker addTarget:self action:@selector(didSelectValueChanged:) forControlEvents:UIControlEventValueChanged];
}
return _datePicker;
}
#pragma mark - 日期选择器2
- (UIPickerView *)pickerView {
if (!_pickerView) {
CGFloat pickerHeaderViewHeight = self.pickerHeaderView ? self.pickerHeaderView.bounds.size.height : 0;
_pickerView = [[UIPickerView alloc]initWithFrame:CGRectMake(0, self.pickerStyle.titleBarHeight + pickerHeaderViewHeight, self.keyView.bounds.size.width, self.pickerStyle.pickerHeight)];
_pickerView.backgroundColor = self.pickerStyle.pickerColor;
_pickerView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth;
_pickerView.dataSource = self;
_pickerView.delegate = self;
}
return _pickerView;
}
#pragma mark - UIPickerViewDataSource
// 1.设置 pickerView 的列数
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
if (self.pickerMode == BRDatePickerModeYMDHMS) {
return 6;
} else if (self.pickerMode == BRDatePickerModeYMDHM) {
return 5;
} else if (self.pickerMode == BRDatePickerModeYMDH) {
return 4;
} else if (self.pickerMode == BRDatePickerModeMDHM) {
return 4;
} else if (self.pickerMode == BRDatePickerModeYMD) {
return 3;
} else if (self.pickerMode == BRDatePickerModeYM) {
return 2;
} else if (self.pickerMode == BRDatePickerModeY) {
return 1;
} else if (self.pickerMode == BRDatePickerModeMD) {
return 2;
} else if (self.pickerMode == BRDatePickerModeHMS) {
return 3;
} else if (self.pickerMode == BRDatePickerModeHM) {
return 2;
} else if (self.pickerMode == BRDatePickerModeMS) {
return 2;
} else if (self.pickerMode == BRDatePickerModeYMW) {
return 3;
} else if (self.pickerMode == BRDatePickerModeYW) {
return 2;
} else if (self.pickerMode == BRDatePickerModeYQ) {
return 2;
}
return 0;
}
// 2.设置 pickerView 每列的行数
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
NSArray *rowsArr = [NSArray array];
if (self.pickerMode == BRDatePickerModeYMDHMS) {
rowsArr = @[@(self.yearArr.count), @(self.monthArr.count), @(self.dayArr.count), @(self.hourArr.count), @(self.minuteArr.count), @(self.secondArr.count)];
} else if (self.pickerMode == BRDatePickerModeYMDHM) {
rowsArr = @[@(self.yearArr.count), @(self.monthArr.count), @(self.dayArr.count), @(self.hourArr.count), @(self.minuteArr.count)];
} else if (self.pickerMode == BRDatePickerModeYMDH) {
rowsArr = @[@(self.yearArr.count), @(self.monthArr.count), @(self.dayArr.count), @(self.hourArr.count)];
} else if (self.pickerMode == BRDatePickerModeMDHM) {
rowsArr = @[@(self.monthArr.count), @(self.dayArr.count), @(self.hourArr.count), @(self.minuteArr.count)];
} else if (self.pickerMode == BRDatePickerModeYMD) {
if ([self.pickerStyle.language hasPrefix:@"zh"]) {
rowsArr = @[@(self.yearArr.count), @(self.monthArr.count), @(self.dayArr.count)];
} else {
rowsArr = @[@(self.dayArr.count), @(self.monthArr.count), @(self.yearArr.count)];
}
} else if (self.pickerMode == BRDatePickerModeYM) {
if ([self.pickerStyle.language hasPrefix:@"zh"]) {
rowsArr = @[@(self.yearArr.count), @(self.monthArr.count)];
} else {
rowsArr = @[@(self.monthArr.count), @(self.yearArr.count)];
}
} else if (self.pickerMode == BRDatePickerModeY) {
rowsArr = @[@(self.yearArr.count)];
} else if (self.pickerMode == BRDatePickerModeMD) {
rowsArr = @[@(self.monthArr.count), @(self.dayArr.count)];
} else if (self.pickerMode == BRDatePickerModeHMS) {
rowsArr = @[@(self.hourArr.count), @(self.minuteArr.count), @(self.secondArr.count)];
} else if (self.pickerMode == BRDatePickerModeHM) {
rowsArr = @[@(self.hourArr.count), @(self.minuteArr.count)];
} else if (self.pickerMode == BRDatePickerModeMS) {
rowsArr = @[@(self.minuteArr.count), @(self.secondArr.count)];
} else if (self.pickerMode == BRDatePickerModeYMW) {
rowsArr = @[@(self.yearArr.count), @(self.monthArr.count), @(self.monthWeekArr.count)];
} else if (self.pickerMode == BRDatePickerModeYW) {
rowsArr = @[@(self.yearArr.count), @(self.yearWeekArr.count)];
} else if (self.pickerMode == BRDatePickerModeYQ) {
rowsArr = @[@(self.yearArr.count), @(self.quarterArr.count)];
}
if (component >= 0 && component < rowsArr.count) {
return [rowsArr[component] integerValue];
}
return 0;
}
#pragma mark - UIPickerViewDelegate
// 3. 设置 pickerView 的显示内容
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view {
// 1.自定义 row 的内容视图
UILabel *label = (UILabel *)view;
if (!label) {
label = [[UILabel alloc]init];
label.backgroundColor = [UIColor clearColor];
label.textAlignment = NSTextAlignmentCenter;
label.font = self.pickerStyle.pickerTextFont;
label.textColor = self.pickerStyle.pickerTextColor;
// 字体自适应属性
label.adjustsFontSizeToFitWidth = YES;
// 自适应最小字体缩放比例
label.minimumScaleFactor = 0.5f;
}
label.text = [self pickerView:pickerView titleForRow:row forComponent:component];
// 2.设置选择器中间选中行的样式
[self.pickerStyle setupPickerSelectRowStyle:pickerView titleForRow:row forComponent:component];
return label;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
NSString *titleString = @"";
if (self.pickerMode == BRDatePickerModeYMDHMS) {
if (component == 0) {
titleString = [self getYearText:self.yearArr row:row];
} else if (component == 1) {
titleString = [self getMonthText:self.monthArr row:row];
} else if (component == 2) {
titleString = [self getDayText:self.dayArr row:row mSelectDate:self.mSelectDate];
} else if (component == 3) {
titleString = [self getHourText:self.hourArr row:row];
} else if (component == 4) {
titleString = [self getMinuteText:self.minuteArr row:row];
} else if (component == 5) {
titleString = [self getSecondText:self.secondArr row:row];
}
} else if (self.pickerMode == BRDatePickerModeYMDHM) {
if (component == 0) {
titleString = [self getYearText:self.yearArr row:row];
} else if (component == 1) {
titleString = [self getMonthText:self.monthArr row:row];
} else if (component == 2) {
titleString = [self getDayText:self.dayArr row:row mSelectDate:self.mSelectDate];
} else if (component == 3) {
titleString = [self getHourText:self.hourArr row:row];
} else if (component == 4) {
titleString = [self getMinuteText:self.minuteArr row:row];
}
} else if (self.pickerMode == BRDatePickerModeYMDH) {
if (component == 0) {
titleString = [self getYearText:self.yearArr row:row];;
} else if (component == 1) {
titleString = [self getMonthText:self.monthArr row:row];
} else if (component == 2) {
titleString = [self getDayText:self.dayArr row:row mSelectDate:self.mSelectDate];
} else if (component == 3) {
titleString = [self getHourText:self.hourArr row:row];
}
} else if (self.pickerMode == BRDatePickerModeMDHM) {
if (component == 0) {
titleString = [self getMonthText:self.monthArr row:row];
} else if (component == 1) {
titleString = [self getDayText:self.dayArr row:row mSelectDate:self.mSelectDate];
} else if (component == 2) {
titleString = [self getHourText:self.hourArr row:row];
} else if (component == 3) {
titleString = [self getMinuteText:self.minuteArr row:row];
}
} else if (self.pickerMode == BRDatePickerModeYMD) {
if (component == 0) {
titleString = [self.pickerStyle.language hasPrefix:@"zh"] ? [self getYearText:self.yearArr row:row] : [self getDayText:self.dayArr row:row mSelectDate:self.mSelectDate];
} else if (component == 1) {
titleString = [self getMonthText:self.monthArr row:row];
} else if (component == 2) {
titleString = [self.pickerStyle.language hasPrefix:@"zh"] ? [self getDayText:self.dayArr row:row mSelectDate:self.mSelectDate] : [self getYearText:self.yearArr row:row];
}
} else if (self.pickerMode == BRDatePickerModeYM) {
if (component == 0) {
titleString = [self.pickerStyle.language hasPrefix:@"zh"] ? [self getYearText:self.yearArr row:row] : [self getMonthText:self.monthArr row:row];
} else if (component == 1) {
titleString = [self.pickerStyle.language hasPrefix:@"zh"] ? [self getMonthText:self.monthArr row:row] : [self getYearText:self.yearArr row:row];
}
} else if (self.pickerMode == BRDatePickerModeY) {
if (component == 0) {
titleString = [self getYearText:self.yearArr row:row];
}
} else if (self.pickerMode == BRDatePickerModeMD) {
if (component == 0) {
titleString = [self getMonthText:self.monthArr row:row];
} else if (component == 1) {
titleString = [self getDayText:self.dayArr row:row mSelectDate:self.mSelectDate];
}
} else if (self.pickerMode == BRDatePickerModeHMS) {
if (component == 0) {
titleString = [self getHourText:self.hourArr row:row];
} else if (component == 1) {
titleString = [self getMinuteText:self.minuteArr row:row];
} else if (component == 2) {
titleString = [self getSecondText:self.secondArr row:row];
}
} else if (self.pickerMode == BRDatePickerModeHM) {
if (component == 0) {
titleString = [self getHourText:self.hourArr row:row];
} else if (component == 1) {
titleString = [self getMinuteText:self.minuteArr row:row];
}
} else if (self.pickerMode == BRDatePickerModeMS) {
if (component == 0) {
titleString = [self getMinuteText:self.minuteArr row:row];
} else if (component == 1) {
titleString = [self getSecondText:self.secondArr row:row];
}
} else if (self.pickerMode == BRDatePickerModeYMW) {
if (component == 0) {
titleString = [self getYearText:self.yearArr row:row];
} else if (component == 1) {
titleString = [self getMonthText:self.monthArr row:row];
} else if (component == 2) {
titleString = [self getWeekText:self.monthWeekArr row:row];
}
} else if (self.pickerMode == BRDatePickerModeYW) {
if (component == 0) {
titleString = [self getYearText:self.yearArr row:row];
} else if (component == 1) {
titleString = [self getWeekText:self.yearWeekArr row:row];
}
} else if (self.pickerMode == BRDatePickerModeYQ) {
if (component == 0) {
titleString = [self getYearText:self.yearArr row:row];
} else if (component == 1) {
titleString = [self getQuarterText:self.quarterArr row:row];
}
}
return titleString;
}
// 4.滚动 pickerView 执行的回调方法
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
NSString *lastSelectValue = self.mSelectValue;
NSDate *lastSelectDate = self.mSelectDate;
if (self.pickerMode == BRDatePickerModeYMDHMS) {
if (component == 0) {
self.yearIndex = row;
[self reloadDateArrayWithUpdateMonth:YES updateDay:YES updateHour:YES updateMinute:YES updateSecond:YES];
[self.pickerView reloadComponent:1];
[self.pickerView reloadComponent:2];
[self.pickerView reloadComponent:3];
[self.pickerView reloadComponent:4];
[self.pickerView reloadComponent:5];
} else if (component == 1) {
self.monthIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:YES updateHour:YES updateMinute:YES updateSecond:YES];
[self.pickerView reloadComponent:2];
[self.pickerView reloadComponent:3];
[self.pickerView reloadComponent:4];
[self.pickerView reloadComponent:5];
} else if (component == 2) {
self.dayIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:YES updateMinute:YES updateSecond:YES];
[self.pickerView reloadComponent:3];
[self.pickerView reloadComponent:4];
[self.pickerView reloadComponent:5];
} else if (component == 3) {
self.hourIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:YES updateSecond:YES];
[self.pickerView reloadComponent:4];
[self.pickerView reloadComponent:5];
} else if (component == 4) {
self.minuteIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:NO updateSecond:YES];
[self.pickerView reloadComponent:5];
} else if (component == 5) {
self.secondIndex = row;
}
NSString *yearString = [self getYearString];
if (![yearString isEqualToString:self.lastRowContent] && ![yearString isEqualToString:self.firstRowContent]) {
if (self.yearArr.count * self.monthArr.count * self.dayArr.count * self.hourArr.count * self.minuteArr.count * self.secondArr.count == 0) return;
int year = [[self getYearString] intValue];
int month = [[self getMonthString] intValue];
int day = [[self getDayString] intValue];
int hour = [[self getHourString] intValue];
int minute = [[self getMinuteString] intValue];
int second = [[self getSecondString] intValue];
self.mSelectDate = [NSDate br_setYear:year month:month day:day hour:hour minute:minute second:second];
self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, minute, second];
} else {
self.mSelectDate = self.addToNow ? [NSDate date] : nil;
if ([yearString isEqualToString:self.lastRowContent]) {
self.mSelectValue = self.lastRowContent;
} else if ([yearString isEqualToString:self.firstRowContent]) {
self.mSelectValue = self.firstRowContent;
}
}
} else if (self.pickerMode == BRDatePickerModeYMDHM) {
if (component == 0) {
self.yearIndex = row;
[self reloadDateArrayWithUpdateMonth:YES updateDay:YES updateHour:YES updateMinute:YES updateSecond:NO];
[self.pickerView reloadComponent:1];
[self.pickerView reloadComponent:2];
[self.pickerView reloadComponent:3];
[self.pickerView reloadComponent:4];
} else if (component == 1) {
self.monthIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:YES updateHour:YES updateMinute:YES updateSecond:NO];
[self.pickerView reloadComponent:2];
[self.pickerView reloadComponent:3];
[self.pickerView reloadComponent:4];
} else if (component == 2) {
self.dayIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:YES updateMinute:YES updateSecond:NO];
[self.pickerView reloadComponent:3];
[self.pickerView reloadComponent:4];
} else if (component == 3) {
self.hourIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:YES updateSecond:NO];
[self.pickerView reloadComponent:4];
} else if (component == 4) {
self.minuteIndex = row;
}
NSString *yearString = [self getYearString];
if (![yearString isEqualToString:self.lastRowContent] && ![yearString isEqualToString:self.firstRowContent]) {
if (self.yearArr.count * self.monthArr.count * self.dayArr.count * self.hourArr.count * self.minuteArr.count == 0) return;
int year = [[self getYearString] intValue];
int month = [[self getMonthString] intValue];
int day = [[self getDayString] intValue];
int hour = [[self getHourString] intValue];
int minute = [[self getMinuteString] intValue];
self.mSelectDate = [NSDate br_setYear:year month:month day:day hour:hour minute:minute];
self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d-%02d %02d:%02d", year, month, day, hour, minute];
} else {
self.mSelectDate = self.addToNow ? [NSDate date] : nil;
if ([yearString isEqualToString:self.lastRowContent]) {
self.mSelectValue = self.lastRowContent;
} else if ([yearString isEqualToString:self.firstRowContent]) {
self.mSelectValue = self.firstRowContent;
}
}
} else if (self.pickerMode == BRDatePickerModeYMDH) {
if (component == 0) {
self.yearIndex = row;
[self reloadDateArrayWithUpdateMonth:YES updateDay:YES updateHour:YES updateMinute:NO updateSecond:NO];
[self.pickerView reloadComponent:1];
[self.pickerView reloadComponent:2];
[self.pickerView reloadComponent:3];
} else if (component == 1) {
self.monthIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:YES updateHour:YES updateMinute:NO updateSecond:NO];
[self.pickerView reloadComponent:2];
[self.pickerView reloadComponent:3];
} else if (component == 2) {
self.dayIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:YES updateMinute:NO updateSecond:NO];
[self.pickerView reloadComponent:3];
} else if (component == 3) {
self.hourIndex = row;
}
NSString *yearString = [self getYearString];
if (![yearString isEqualToString:self.lastRowContent] && ![yearString isEqualToString:self.firstRowContent]) {
if (self.yearArr.count * self.monthArr.count * self.dayArr.count * self.hourArr.count == 0) return;
int year = [[self getYearString] intValue];
int month = [[self getMonthString] intValue];
int day = [[self getDayString] intValue];
int hour = 0;
if (self.pickerMode == BRDatePickerModeYMDH && self.isShowAMAndPM) {
hour = (self.hourIndex == 0 ? 0 : 12);
self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d-%02d %@", year, month, day, [self getHourString]];
} else {
hour = [[self getHourString] intValue];
self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d-%02d %02d", year, month, day, hour];
}
self.mSelectDate = [NSDate br_setYear:year month:month day:day hour:hour];
} else {
self.mSelectDate = self.addToNow ? [NSDate date] : nil;
if ([yearString isEqualToString:self.lastRowContent]) {
self.mSelectValue = self.lastRowContent;
} else if ([yearString isEqualToString:self.firstRowContent]) {
self.mSelectValue = self.firstRowContent;
}
}
} else if (self.pickerMode == BRDatePickerModeMDHM) {
if (component == 0) {
self.monthIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:YES updateHour:YES updateMinute:YES updateSecond:NO];
[self.pickerView reloadComponent:1];
[self.pickerView reloadComponent:2];
[self.pickerView reloadComponent:3];
} else if (component == 1) {
self.dayIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:YES updateMinute:YES updateSecond:NO];
[self.pickerView reloadComponent:2];
[self.pickerView reloadComponent:3];
} else if (component == 2) {
self.hourIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:YES updateSecond:NO];
[self.pickerView reloadComponent:3];
} else if (component == 3) {
self.minuteIndex = row;
}
NSString *monthString = [self getMonthString];
if (![monthString isEqualToString:self.lastRowContent] && ![monthString isEqualToString:self.firstRowContent]) {
if (self.yearArr.count * self.monthArr.count * self.dayArr.count * self.hourArr.count * self.minuteArr.count == 0) return;
int year = [[self getYearString] intValue];
int month = [[self getMonthString] intValue];
int day = [[self getDayString] intValue];
int hour = [[self getHourString] intValue];
int minute = [[self getMinuteString] intValue];
self.mSelectDate = [NSDate br_setYear:year month:month day:day hour:hour minute:minute];
self.mSelectValue = [NSString stringWithFormat:@"%02d-%02d %02d:%02d", month, day, hour, minute];
} else {
self.mSelectDate = self.addToNow ? [NSDate date] : nil;
if ([monthString isEqualToString:self.lastRowContent]) {
self.mSelectValue = self.lastRowContent;
} else if ([monthString isEqualToString:self.firstRowContent]) {
self.mSelectValue = self.firstRowContent;
}
}
} else if (self.pickerMode == BRDatePickerModeYMD) {
if (component == 0) {
if ([self.pickerStyle.language hasPrefix:@"zh"]) {
self.yearIndex = row;
[self reloadDateArrayWithUpdateMonth:YES updateDay:YES updateHour:NO updateMinute:NO updateSecond:NO];
[self.pickerView reloadComponent:1];
[self.pickerView reloadComponent:2];
} else {
self.dayIndex = row;
}
} else if (component == 1) {
self.monthIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:YES updateHour:NO updateMinute:NO updateSecond:NO];
if ([self.pickerStyle.language hasPrefix:@"zh"]) {
[self.pickerView reloadComponent:2];
} else {
[self.pickerView reloadComponent:0];
}
} else if (component == 2) {
if ([self.pickerStyle.language hasPrefix:@"zh"]) {
self.dayIndex = row;
} else {
self.yearIndex = row;
[self reloadDateArrayWithUpdateMonth:YES updateDay:YES updateHour:NO updateMinute:NO updateSecond:NO];
[self.pickerView reloadComponent:0];
[self.pickerView reloadComponent:1];
}
}
NSString *yearString = [self getYearString];
if (![yearString isEqualToString:self.lastRowContent] && ![yearString isEqualToString:self.firstRowContent]) {
if (self.yearArr.count * self.monthArr.count * self.dayArr.count == 0) return;
int year = [[self getYearString] intValue];
int month = [[self getMonthString] intValue];
int day = [[self getDayString] intValue];
self.mSelectDate = [NSDate br_setYear:year month:month day:day];
self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d-%02d", year, month, day];
} else {
self.mSelectDate = self.addToNow ? [NSDate date] : nil;
if ([yearString isEqualToString:self.lastRowContent]) {
self.mSelectValue = self.lastRowContent;
} else if ([yearString isEqualToString:self.firstRowContent]) {
self.mSelectValue = self.firstRowContent;
}
}
} else if (self.pickerMode == BRDatePickerModeYM) {
if (component == 0) {
if ([self.pickerStyle.language hasPrefix:@"zh"]) {
self.yearIndex = row;
[self reloadDateArrayWithUpdateMonth:YES updateDay:NO updateHour:NO updateMinute:NO updateSecond:NO];
[self.pickerView reloadComponent:1];
} else {
self.monthIndex = row;
}
} else if (component == 1) {
if ([self.pickerStyle.language hasPrefix:@"zh"]) {
self.monthIndex = row;
} else {
self.yearIndex = row;
[self reloadDateArrayWithUpdateMonth:YES updateDay:NO updateHour:NO updateMinute:NO updateSecond:NO];
[self.pickerView reloadComponent:0];
}
}
NSString *yearString = [self getYearString];
if (![yearString isEqualToString:self.lastRowContent] && ![yearString isEqualToString:self.firstRowContent]) {
if (self.yearArr.count * self.monthArr.count == 0) return;
int year = [[self getYearString] intValue];
int month = [[self getMonthString] intValue];
self.mSelectDate = [NSDate br_setYear:year month:month];
self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d", year, month];
} else {
self.mSelectDate = self.addToNow ? [NSDate date] : nil;
if ([yearString isEqualToString:self.lastRowContent]) {
self.mSelectValue = self.lastRowContent;
} else if ([yearString isEqualToString:self.firstRowContent]) {
self.mSelectValue = self.firstRowContent;
}
}
} else if (self.pickerMode == BRDatePickerModeY) {
if (component == 0) {
self.yearIndex = row;
}
NSString *yearString = [self getYearString];
if (![yearString isEqualToString:self.lastRowContent] && ![yearString isEqualToString:self.firstRowContent]) {
if (self.yearArr.count == 0) return;
int year = [[self getYearString] intValue];
self.mSelectDate = [NSDate br_setYear:year];
self.mSelectValue = [NSString stringWithFormat:@"%04d", year];
} else {
self.mSelectDate = self.addToNow ? [NSDate date] : nil;
if ([yearString isEqualToString:self.lastRowContent]) {
self.mSelectValue = self.lastRowContent;
} else if ([yearString isEqualToString:self.firstRowContent]) {
self.mSelectValue = self.firstRowContent;
}
}
} else if (self.pickerMode == BRDatePickerModeMD) {
if (component == 0) {
self.monthIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:YES updateHour:NO updateMinute:NO updateSecond:NO];
[self.pickerView reloadComponent:1];
} else if (component == 1) {
self.dayIndex = row;
}
NSString *monthString = [self getMonthString];
if (![monthString isEqualToString:self.lastRowContent] && ![monthString isEqualToString:self.firstRowContent]) {
if (self.yearArr.count * self.monthArr.count * self.dayArr.count == 0) return;
int year = [[self getYearString] intValue];
int month = [[self getMonthString] intValue];
int day = [[self getDayString] intValue];
self.mSelectDate = [NSDate br_setYear:year month:month day:day];
self.mSelectValue = [NSString stringWithFormat:@"%02d-%02d", month, day];
} else {
self.mSelectDate = self.addToNow ? [NSDate date] : nil;
if ([monthString isEqualToString:self.lastRowContent]) {
self.mSelectValue = self.lastRowContent;
} else if ([monthString isEqualToString:self.firstRowContent]) {
self.mSelectValue = self.firstRowContent;
}
}
} else if (self.pickerMode == BRDatePickerModeHMS) {
if (component == 0) {
self.hourIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:YES updateSecond:YES];
[self.pickerView reloadComponent:1];
[self.pickerView reloadComponent:2];
} else if (component == 1) {
self.minuteIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:NO updateSecond:YES];
[self.pickerView reloadComponent:2];
} else if (component == 2) {
self.secondIndex = row;
}
NSString *hourString = [self getHourString];
if (![hourString isEqualToString:self.lastRowContent] && ![hourString isEqualToString:self.firstRowContent]) {
if (self.hourArr.count * self.minuteArr.count * self.secondArr.count == 0) return;
int hour = [[self getHourString] intValue];
int minute = [[self getMinuteString] intValue];
int second = [[self getSecondString] intValue];
self.mSelectDate = [NSDate br_setHour:hour minute:minute second:second];
self.mSelectValue = [NSString stringWithFormat:@"%02d:%02d:%02d", hour, minute, second];
} else {
self.mSelectDate = self.addToNow ? [NSDate date] : nil;
if ([hourString isEqualToString:self.lastRowContent]) {
self.mSelectValue = self.lastRowContent;
} else if ([hourString isEqualToString:self.firstRowContent]) {
self.mSelectValue = self.firstRowContent;
}
}
} else if (self.pickerMode == BRDatePickerModeHM) {
if (component == 0) {
self.hourIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:YES updateSecond:NO];
[self.pickerView reloadComponent:1];
} else if (component == 1) {
self.minuteIndex = row;
}
NSString *hourString = [self getHourString];
if (![hourString isEqualToString:self.lastRowContent] && ![hourString isEqualToString:self.firstRowContent]) {
if (self.hourArr.count * self.minuteArr.count == 0) return;
int hour = [[self getHourString] intValue];
int minute = [[self getMinuteString] intValue];
self.mSelectDate = [NSDate br_setHour:hour minute:minute];
self.mSelectValue = [NSString stringWithFormat:@"%02d:%02d", hour, minute];
} else {
self.mSelectDate = self.addToNow ? [NSDate date] : nil;
if ([hourString isEqualToString:self.lastRowContent]) {
self.mSelectValue = self.lastRowContent;
} else if ([hourString isEqualToString:self.firstRowContent]) {
self.mSelectValue = self.firstRowContent;
}
}
} else if (self.pickerMode == BRDatePickerModeMS) {
if (component == 0) {
self.minuteIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:NO updateSecond:YES];
[self.pickerView reloadComponent:1];
} else if (component == 1) {
self.secondIndex = row;
}
NSString *minuteString = [self getMinuteString];
if (![minuteString isEqualToString:self.lastRowContent] && ![minuteString isEqualToString:self.firstRowContent]) {
if (self.minuteArr.count * self.secondArr.count == 0) return;
int minute = [[self getMinuteString] intValue];
int second = [[self getSecondString] intValue];
self.mSelectDate = [NSDate br_setMinute:minute second:second];
self.mSelectValue = [NSString stringWithFormat:@"%02d:%02d", minute, second];
} else {
self.mSelectDate = self.addToNow ? [NSDate date] : nil;
if ([minuteString isEqualToString:self.lastRowContent]) {
self.mSelectValue = self.lastRowContent;
} else if ([minuteString isEqualToString:self.firstRowContent]) {
self.mSelectValue = self.firstRowContent;
}
}
} else if (self.pickerMode == BRDatePickerModeYMW) {
if (component == 0) {
self.yearIndex = row;
[self reloadDateArrayWithUpdateMonth:YES updateDay:NO updateHour:NO updateMinute:NO updateSecond:NO updateWeekOfMonth:YES updateWeekOfYear:NO updateQuarter:NO];
[self.pickerView reloadComponent:1];
[self.pickerView reloadComponent:2];
} else if (component == 1) {
self.monthIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:NO updateSecond:NO updateWeekOfMonth:YES updateWeekOfYear:NO updateQuarter:NO];
[self.pickerView reloadComponent:2];
} else if (component == 2) {
self.monthWeekIndex = row;
}
NSString *yearString = [self getYearString];
if (![yearString isEqualToString:self.lastRowContent] && ![yearString isEqualToString:self.firstRowContent]) {
if (self.yearArr.count * self.monthArr.count * self.monthWeekArr.count == 0) return;
int year = [[self getYearString] intValue];
int month = [[self getMonthString] intValue];
int week = [[self getMonthWeekString] intValue];
self.mSelectDate = [NSDate br_setYear:year month:month weekOfMonth:week];
self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d-%02d", year, month, week];
} else {
self.mSelectDate = self.addToNow ? [NSDate date] : nil;
if ([yearString isEqualToString:self.lastRowContent]) {
self.mSelectValue = self.lastRowContent;
} else if ([yearString isEqualToString:self.firstRowContent]) {
self.mSelectValue = self.firstRowContent;
}
}
} else if (self.pickerMode == BRDatePickerModeYW) {
if (component == 0) {
self.yearIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:NO updateSecond:NO updateWeekOfMonth:NO updateWeekOfYear:YES updateQuarter:NO];
[self.pickerView reloadComponent:1];
} else if (component == 1) {
self.yearWeekIndex = row;
}
NSString *yearString = [self getYearString];
if (![yearString isEqualToString:self.lastRowContent] && ![yearString isEqualToString:self.firstRowContent]) {
if (self.yearArr.count * self.monthArr.count * self.monthWeekArr.count == 0) return;
int year = [[self getYearString] intValue];
int week = [[self getYearWeekString] intValue];
self.mSelectDate = [NSDate br_setYear:year weekOfYear:week];
self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d", year, week];
} else {
self.mSelectDate = self.addToNow ? [NSDate date] : nil;
if ([yearString isEqualToString:self.lastRowContent]) {
self.mSelectValue = self.lastRowContent;
} else if ([yearString isEqualToString:self.firstRowContent]) {
self.mSelectValue = self.firstRowContent;
}
}
} else if (self.pickerMode == BRDatePickerModeYQ) {
if (component == 0) {
self.yearIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:NO updateSecond:NO updateWeekOfMonth:NO updateWeekOfYear:NO updateQuarter:YES];
[self.pickerView reloadComponent:1];
} else if (component == 1) {
self.quarterIndex = row;
}
NSString *yearString = [self getYearString];
if (![yearString isEqualToString:self.lastRowContent] && ![yearString isEqualToString:self.firstRowContent]) {
if (self.yearArr.count * self.monthArr.count * self.monthWeekArr.count == 0) return;
int year = [[self getYearString] intValue];
int quarter = [[self getQuarterString] intValue];
self.mSelectDate = [NSDate br_setYear:year quarter:quarter];
self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d", year, quarter];
} else {
self.mSelectDate = self.addToNow ? [NSDate date] : nil;
if ([yearString isEqualToString:self.lastRowContent]) {
self.mSelectValue = self.lastRowContent;
} else if ([yearString isEqualToString:self.firstRowContent]) {
self.mSelectValue = self.firstRowContent;
}
}
}
// 纠正选择日期(解决:由【自定义字符串】滚动到 其它日期时,或设置 minDate日期联动不正确问题
BOOL isLastRowContent = [lastSelectValue isEqualToString:self.lastRowContent] && ![self.mSelectValue isEqualToString:self.lastRowContent] && ![self.mSelectValue isEqualToString:self.firstRowContent];
BOOL isFirstRowContent = [lastSelectValue isEqualToString:self.firstRowContent] && ![self.mSelectValue isEqualToString:self.lastRowContent] && ![self.mSelectValue isEqualToString:self.firstRowContent];
if (isLastRowContent || isFirstRowContent || _isAdjustSelectRow) {
[self scrollToSelectDate:self.mSelectDate animated:NO];
}
// 禁止选择日期:回滚到上次选择的日期
if (self.nonSelectableDates && self.nonSelectableDates.count > 0 && ![self.mSelectValue isEqualToString:self.lastRowContent] && ![self.mSelectValue isEqualToString:self.firstRowContent]) {
for (NSDate *date in self.nonSelectableDates) {
if ([self br_compareDate:date targetDate:self.mSelectDate dateFormat:self.dateFormatter] == NSOrderedSame) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 如果当前的日期不可选择,就回滚到上次选择的日期
[self scrollToSelectDate:lastSelectDate animated:YES];
});
// 不可选择日期的回调
if (self.nonSelectableBlock) {
self.nonSelectableBlock(self.mSelectDate, self.mSelectValue);
}
self.mSelectDate = lastSelectDate;
self.mSelectValue = lastSelectValue;
break;
}
}
}
// 滚动选择时执行 changeBlock 回调
if (self.changeBlock) {
self.changeBlock(self.mSelectDate, self.mSelectValue);
}
// 滚动选择范围时执行 changeBlock 回调
if (self.changeRangeBlock) {
self.changeRangeBlock(self.getSelectRangeDate.firstObject, self.getSelectRangeDate.lastObject, self.mSelectValue);
}
// 设置自动选择时,滚动选择时就执行 resultBlock
if (self.isAutoSelect) {
// 滚动完成后执行block回调
if (self.resultBlock) {
self.resultBlock(self.mSelectDate, self.mSelectValue);
}
if (self.resultRangeBlock) {
self.resultRangeBlock(self.getSelectRangeDate.firstObject, self.getSelectRangeDate.lastObject, self.mSelectValue);
}
}
}
// 设置行高
- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component {
return self.pickerStyle.rowHeight;
}
#pragma mark - 日期选择器1 滚动后的响应事件
- (void)didSelectValueChanged:(UIDatePicker *)sender {
// 读取日期datePicker.date
self.mSelectDate = sender.date;
if (_datePickerMode != UIDatePickerModeCountDownTimer) {
BOOL selectLessThanMin = [self br_compareDate:self.mSelectDate targetDate:self.minDate dateFormat:self.dateFormatter] == NSOrderedAscending;
BOOL selectMoreThanMax = [self br_compareDate:self.mSelectDate targetDate:self.maxDate dateFormat:self.dateFormatter] == NSOrderedDescending;
if (selectLessThanMin) {
self.mSelectDate = self.minDate;
}
if (selectMoreThanMax) {
self.mSelectDate = self.maxDate;
}
}
[self.datePicker setDate:self.mSelectDate animated:YES];
self.mSelectValue = [self br_stringFromDate:self.mSelectDate dateFormat:self.dateFormatter];
// 滚动选择时执行 changeBlock 回调
if (self.changeBlock) {
self.changeBlock(self.mSelectDate, self.mSelectValue);
}
// 滚动选择范围时执行 changeBlock 回调
if (self.changeRangeBlock) {
self.changeRangeBlock(self.getSelectRangeDate.firstObject, self.getSelectRangeDate.lastObject, self.mSelectValue);
}
// 设置自动选择时,滚动选择时就执行 resultBlock
if (self.isAutoSelect) {
// 滚动完成后执行block回调
if (self.resultBlock) {
self.resultBlock(self.mSelectDate, self.mSelectValue);
}
if (self.resultRangeBlock) {
self.resultRangeBlock(self.getSelectRangeDate.firstObject, self.getSelectRangeDate.lastObject, self.mSelectValue);
}
}
}
#pragma mark - 重写父类方法
- (void)reloadData {
// 1.处理数据源
[self handlerPickerData];
if (self.style == BRDatePickerStyleSystem) {
// 2.刷新选择器(重新设置相关值)
self.datePicker.datePickerMode = _datePickerMode;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130400 // 编译时检查SDK版本iOS SDK 13.4 以后版本的处理
if (@available(iOS 13.4, *)) {
// 适配 iOS14 以后 UIDatePicker 的显示样式
self.datePicker.preferredDatePickerStyle = UIDatePickerStyleWheels;
// 设置 datePicker 的 frame在iOS14里UIDatePicker 的 frame 赋值必须放在 datePickerMode 赋值之后, 否则 frame 不会生效)
CGFloat pickerHeaderViewHeight = self.pickerHeaderView ? self.pickerHeaderView.bounds.size.height : 0;
self.datePicker.frame = CGRectMake(0, self.pickerStyle.titleBarHeight + pickerHeaderViewHeight, self.keyView.bounds.size.width, self.pickerStyle.pickerHeight);
} else
#endif
{
// Fallback on earlier versions
}
// 设置该 UIDatePicker 的国际化 Locale
self.datePicker.locale = [[NSLocale alloc]initWithLocaleIdentifier:self.pickerStyle.language];
if (self.timeZone) {
self.datePicker.timeZone = self.timeZone;
}
self.datePicker.calendar = self.calendar;
// 设置农历日期
//self.datePicker.calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierChinese];
if (self.minDate) {
self.datePicker.minimumDate = self.minDate;
}
if (self.maxDate) {
self.datePicker.maximumDate = self.maxDate;
}
if (_datePickerMode == UIDatePickerModeCountDownTimer && self.countDownDuration > 0) {
self.datePicker.countDownDuration = self.countDownDuration;
}
if (self.minuteInterval > 1) {
self.datePicker.minuteInterval = self.minuteInterval;
}
// 3.滚动到选择的日期
[self.datePicker setDate:self.mSelectDate animated:NO];
} else if (self.style == BRDatePickerStyleCustom) {
// 2.刷新选择器
[self.pickerView reloadAllComponents];
// 3.滚动到选择的日期
if (self.selectValue && ([self.selectValue isEqualToString:self.lastRowContent] || [self.selectValue isEqualToString:self.firstRowContent])) {
[self scrollToCustomString:NO];
} else {
[self scrollToSelectDate:self.mSelectDate animated:NO];
}
}
}
- (void)addPickerToView:(UIView *)view {
_containerView = view;
[self setupDateFormatter:self.pickerMode];
// 1.添加日期选择器
if (self.style == BRDatePickerStyleSystem) {
[self setupPickerView:self.datePicker toView:view];
} else if (self.style == BRDatePickerStyleCustom) {
[self setupPickerView:self.pickerView toView:view];
if (self.showUnitType == BRShowUnitTypeOnlyCenter) {
// 添加日期单位到选择器
[self addUnitLabel];
}
}
// ③添加中间选择行的两条分割线
if (self.pickerStyle.clearPickerNewStyle) {
[self.pickerStyle addSeparatorLineView:self.pickerView];
}
// 2.绑定数据
[self reloadData];
__weak typeof(self) weakSelf = self;
self.doneBlock = ^{
// 点击确定按钮后执行block回调
if (weakSelf.resultBlock) {
weakSelf.resultBlock(weakSelf.mSelectDate, weakSelf.mSelectValue);
}
if (weakSelf.resultRangeBlock) {
weakSelf.resultRangeBlock(weakSelf.getSelectRangeDate.firstObject, weakSelf.getSelectRangeDate.lastObject, weakSelf.mSelectValue);
}
};
[super addPickerToView:view];
}
#pragma mark - 添加日期单位到选择器
- (void)addUnitLabel {
if (self.unitLabelArr.count > 0) {
for (UILabel *unitLabel in self.unitLabelArr) {
[unitLabel removeFromSuperview];
}
self.unitLabelArr = nil;
}
self.unitLabelArr = [self setupPickerUnitLabel:self.pickerView unitArr:self.unitArr];
}
#pragma mark - 重写父类方法
- (void)addSubViewToPicker:(UIView *)customView {
if (self.style == BRDatePickerStyleSystem) {
[self.datePicker addSubview:customView];
} else if (self.style == BRDatePickerStyleCustom) {
[self.pickerView addSubview:customView];
}
}
#pragma mark - 弹出选择器视图
- (void)show {
[self addPickerToView:nil];
}
#pragma mark - 关闭选择器视图
- (void)dismiss {
[self removePickerFromView:nil];
}
#pragma mark - setter 方法
- (void)setPickerMode:(BRDatePickerMode)pickerMode {
_pickerMode = pickerMode;
// 非空,表示二次设置
if (_datePicker || _pickerView) {
BRDatePickerStyle lastStyle = self.style;
[self setupDateFormatter:pickerMode];
// 系统样式 切换到 自定义样式
if (lastStyle == BRDatePickerStyleSystem && self.style == BRDatePickerStyleCustom) {
[self.datePicker removeFromSuperview];
[self setupPickerView:self.pickerView toView:_containerView];
}
// 自定义样式 切换到 系统样式
if (lastStyle == BRDatePickerStyleCustom && self.style == BRDatePickerStyleSystem) {
[self.pickerView removeFromSuperview];
[self setupPickerView:self.datePicker toView:_containerView];
}
// 刷新选择器数据
[self reloadData];
if (self.style == BRDatePickerStyleCustom && self.showUnitType == BRShowUnitTypeOnlyCenter) {
// 添加日期单位到选择器
[self addUnitLabel];
}
}
}
- (void)setAddToNow:(BOOL)addToNow {
_addToNow = addToNow;
if (addToNow) {
_maxDate = [NSDate date];
_lastRowContent = [NSBundle br_localizedStringForKey:@"至今" language:self.pickerStyle.language];
}
}
- (void)setLastRowContent:(NSString *)lastRowContent {
if (!_addToNow) {
_lastRowContent = lastRowContent;
}
}
// 支持动态设置选择的值
- (void)setSelectDate:(NSDate *)selectDate {
_selectDate = selectDate;
_mSelectDate = selectDate;
if (_datePicker || _pickerView) {
// 刷新选择器数据
[self reloadData];
}
}
- (void)setSelectValue:(NSString *)selectValue {
_selectValue = selectValue;
_mSelectValue = selectValue;
if (_datePicker || _pickerView) {
// 刷新选择器数据
[self reloadData];
}
}
- (void)setAddCustomString:(NSString *)addCustomString {
self.lastRowContent = addCustomString;
}
#pragma mark - getter 方法
- (NSArray *)yearArr {
if (!_yearArr) {
_yearArr = [NSArray array];
}
return _yearArr;
}
- (NSArray *)monthArr {
if (!_monthArr) {
_monthArr = [NSArray array];
}
return _monthArr;
}
- (NSArray *)dayArr {
if (!_dayArr) {
_dayArr = [NSArray array];
}
return _dayArr;
}
- (NSArray *)hourArr {
if (!_hourArr) {
_hourArr = [NSArray array];
}
return _hourArr;
}
- (NSArray *)minuteArr {
if (!_minuteArr) {
_minuteArr = [NSArray array];
}
return _minuteArr;
}
- (NSArray *)secondArr {
if (!_secondArr) {
_secondArr = [NSArray array];
}
return _secondArr;
}
- (NSInteger)minuteInterval {
if (_minuteInterval < 1 || _minuteInterval > 30) {
_minuteInterval = 1;
}
return _minuteInterval;
}
- (NSInteger)secondInterval {
if (_secondInterval < 1 || _secondInterval > 30) {
_secondInterval = 1;
}
return _secondInterval;
}
- (NSArray *)unitArr {
if (!_unitArr) {
_unitArr = [NSArray array];
}
return _unitArr;
}
- (NSArray<UILabel *> *)unitLabelArr {
if (!_unitLabelArr) {
_unitLabelArr = [NSArray array];
}
return _unitLabelArr;
}
- (NSArray<NSString *> *)monthNames {
if (!_monthNames) {
_monthNames = [NSArray array];
}
return _monthNames;
}
- (NSString *)getYearString {
NSInteger index = 0;
if (self.yearIndex >= 0 && self.yearIndex < self.yearArr.count) {
index = self.yearIndex;
}
return [self.yearArr objectAtIndex:index];
}
- (NSString *)getMonthString {
NSInteger index = 0;
if (self.monthIndex >= 0 && self.monthIndex < self.monthArr.count) {
index = self.monthIndex;
}
return [self.monthArr objectAtIndex:index];
}
- (NSString *)getDayString {
NSInteger index = 0;
if (self.dayIndex >= 0 && self.dayIndex < self.dayArr.count) {
index = self.dayIndex;
}
return [self.dayArr objectAtIndex:index];
}
- (NSString *)getHourString {
NSInteger index = 0;
if (self.hourIndex >= 0 && self.hourIndex < self.hourArr.count) {
index = self.hourIndex;
}
return [self.hourArr objectAtIndex:index];
}
- (NSString *)getMinuteString {
NSInteger index = 0;
if (self.minuteIndex >= 0 && self.minuteIndex < self.minuteArr.count) {
index = self.minuteIndex;
}
return [self.minuteArr objectAtIndex:index];
}
- (NSString *)getSecondString {
NSInteger index = 0;
if (self.secondIndex >= 0 && self.secondIndex < self.secondArr.count) {
index = self.secondIndex;
}
return [self.secondArr objectAtIndex:index];
}
- (NSString *)getMonthWeekString {
NSInteger index = 0;
if (self.monthWeekIndex >= 0 && self.monthWeekIndex < self.monthWeekArr.count) {
index = self.monthWeekIndex;
}
return [self.monthWeekArr objectAtIndex:index];
}
- (NSString *)getYearWeekString {
NSInteger index = 0;
if (self.yearWeekIndex >= 0 && self.yearWeekIndex < self.yearWeekArr.count) {
index = self.yearWeekIndex;
}
return [self.yearWeekArr objectAtIndex:index];
}
- (NSString *)getQuarterString {
NSInteger index = 0;
if (self.quarterIndex >= 0 && self.quarterIndex < self.quarterArr.count) {
index = self.quarterIndex;
}
return [self.quarterArr objectAtIndex:index];
}
#pragma mark - 获取选中日期范围
- (NSArray<NSDate *> *)getSelectRangeDate {
NSDate *startDate, *endDate = nil;
switch (self.pickerMode) {
case BRDatePickerModeYMDHMS:
case BRDatePickerModeMS:
case BRDatePickerModeHMS:
{
endDate = self.mSelectDate;
startDate = self.mSelectDate;
}
break;
case BRDatePickerModeYMDHM:
case BRDatePickerModeMDHM:
case BRDatePickerModeHM:
case BRDatePickerModeDateAndTime:
case BRDatePickerModeTime:
{
NSDate *tempDate = [self br_dateFromString:self.mSelectValue dateFormat:self.dateFormatter];
startDate = tempDate;
endDate = [tempDate dateByAddingTimeInterval:59];
}
break;
case BRDatePickerModeYMDH:
{
NSDate *tempDate = [self br_dateFromString:self.mSelectValue dateFormat:self.dateFormatter];
startDate = tempDate;
endDate = [tempDate dateByAddingTimeInterval:60 * 59 + 59];
}
break;
case BRDatePickerModeMD:
case BRDatePickerModeYMD:
case BRDatePickerModeDate:
{
NSDate *tempDate = [self br_dateFromString:self.mSelectValue dateFormat:self.dateFormatter];
startDate = tempDate;
endDate = [[tempDate br_getNewDateToDays:1] dateByAddingTimeInterval:-1];
}
break;
case BRDatePickerModeYM:
{
NSDate *tempDate = [self br_dateFromString:self.mSelectValue dateFormat:self.dateFormatter];
startDate = tempDate;
endDate = [[tempDate br_getNewDateToMonths:1] dateByAddingTimeInterval:-1];
}
break;
case BRDatePickerModeY:
{
NSDate *tempDate = [self br_dateFromString:self.mSelectValue dateFormat:self.dateFormatter];
startDate = tempDate;
endDate = [[tempDate br_getNewDateToMonths:12] dateByAddingTimeInterval:-1];
}
break;
case BRDatePickerModeYMW:
case BRDatePickerModeYW:
{
NSDate *tempDate = [self br_dateFromString:self.mSelectValue dateFormat:self.dateFormatter];
endDate = [tempDate dateByAddingTimeInterval:-1];
startDate = [tempDate br_getNewDateToDays:-7];
}
break;
case BRDatePickerModeYQ:
{
startDate = [self br_dateFromString:self.mSelectValue dateFormat:self.dateFormatter];
endDate = [[startDate br_getNewDateToMonths:3] dateByAddingTimeInterval:-1];
}
break;
default:
break;
}
NSMutableArray *dataArr = [NSMutableArray array];
if (startDate)
[dataArr addObject:startDate];
if (endDate)
[dataArr addObject:endDate];
return dataArr;
}
@end