Files

1759 lines
70 KiB
Mathematica
Raw Permalink Normal View History

2025-08-08 11:05:33 +08:00
//
// BRDatePickerView.m
// BRPickerViewDemo
//
// Created by on 2017/8/11.
// Copyright © 2017 91renb. All rights reserved.
//
// https://github.com/91renb/BRPickerView
#import "BRDatePickerView.h"
#import "NSBundle+BRPickerView.h"
///
typedef NS_ENUM(NSInteger, BRDatePickerStyle) {
BRDatePickerStyleSystem, // 使 UIDatePicker
BRDatePickerStyleCustom // 使 UIPickerView
};
@interface BRDatePickerView ()<UIPickerViewDataSource, UIPickerViewDelegate>
{
UIDatePickerMode _datePickerMode;
}
/** 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, 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, strong) NSDate *mSelectDate;
@property (nonatomic, copy) NSString *mSelectValue;
/** */
@property (nonatomic, assign) BRDatePickerStyle style;
/** */
@property (nonatomic, copy) NSString *selectDateFormatter;
/** */
@property (nonatomic, copy) NSArray *unitArr;
@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 {
//
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 show];
}
#pragma mark -
- (instancetype)initWithPickerMode:(BRDatePickerMode)pickerMode {
if (self = [super init]) {
self.pickerMode = pickerMode;
}
return self;
}
#pragma mark -
- (void)handlerPickerData {
[self setupSelectDateFormatter:self.pickerMode];
// 1.
if (!self.minDate) {
if (self.pickerMode == BRDatePickerModeMDHM) {
self.minDate = [NSDate br_setMonth:1 day:1 hour:0 minute:0];
} else if (self.pickerMode == BRDatePickerModeMD) {
self.minDate = [NSDate br_setMonth:1 day:1];
} else if (self.pickerMode == BRDatePickerModeTime || self.pickerMode == BRDatePickerModeCountDownTimer || self.pickerMode == BRDatePickerModeHM) {
self.minDate = [NSDate br_setHour:0 minute:0];
} else if (self.pickerMode == BRDatePickerModeHMS) {
self.minDate = [NSDate br_setHour:0 minute:0 second:0];
} else if (self.pickerMode == BRDatePickerModeMS) {
self.minDate = [NSDate br_setMinute:0 second:0];
} else {
self.minDate = [NSDate distantPast]; //
}
}
// 2.
if (!self.maxDate) {
if (self.pickerMode == BRDatePickerModeMDHM) {
self.maxDate = [NSDate br_setMonth:12 day:31 hour:23 minute:59];
} else if (self.pickerMode == BRDatePickerModeMD) {
self.maxDate = [NSDate br_setMonth:12 day:31];
} else if (self.pickerMode == BRDatePickerModeTime || self.pickerMode == BRDatePickerModeCountDownTimer || self.pickerMode == BRDatePickerModeHM) {
self.maxDate = [NSDate br_setHour:23 minute:59];
} else if (self.pickerMode == BRDatePickerModeHMS) {
self.maxDate = [NSDate br_setHour:23 minute:59 second:59];
} else if (self.pickerMode == BRDatePickerModeMS) {
self.maxDate = [NSDate br_setMinute:59 second:59];
} else {
self.maxDate = [NSDate distantFuture]; //
}
}
BOOL minMoreThanMax = [self.minDate br_compare:self.maxDate format:self.selectDateFormatter] == NSOrderedDescending;
NSAssert(!minMoreThanMax, @"最小日期不能大于最大日期!");
if (minMoreThanMax) {
//
self.minDate = [NSDate distantPast];
self.maxDate = [NSDate distantFuture];
}
// 3.
[self handlerDefaultSelectDate];
if (self.style == BRDatePickerStyleCustom) {
[self initDateArray];
}
}
- (void)handlerDefaultSelectDate {
// selectDate selectValue使 selectDate
if (!self.selectDate) {
if (self.selectValue && self.selectValue.length > 0) {
NSDate *defaultSelDate = [self.selectValue isEqualToString:[self getNowString]] ? [NSDate date] : [NSDate br_getDate:self.selectValue format:self.selectDateFormatter];
if (!defaultSelDate) {
BRErrorLog(@"参数异常!字符串 selectValue 的正确格式是:%@", self.selectDateFormatter);
NSAssert(defaultSelDate, @"参数异常!请检查字符串 selectValue 的格式");
defaultSelDate = [NSDate date]; // / Release
}
if (self.pickerMode == BRDatePickerModeMDHM) {
self.mSelectDate = [NSDate br_setMonth:defaultSelDate.br_month day:defaultSelDate.br_day hour:defaultSelDate.br_hour minute:defaultSelDate.br_minute];
} else if (self.pickerMode == BRDatePickerModeMD) {
self.mSelectDate = [NSDate br_setMonth:defaultSelDate.br_month day:defaultSelDate.br_day];
} else if (self.pickerMode == BRDatePickerModeTime || self.pickerMode == BRDatePickerModeCountDownTimer || self.pickerMode == BRDatePickerModeHM) {
self.mSelectDate = [NSDate br_setHour:defaultSelDate.br_hour minute:defaultSelDate.br_minute];
} else if (self.pickerMode == BRDatePickerModeHMS) {
self.mSelectDate = [NSDate br_setHour:defaultSelDate.br_hour minute:defaultSelDate.br_minute second:defaultSelDate.br_second];
} else if (self.pickerMode == BRDatePickerModeMS) {
self.mSelectDate = [NSDate br_setMinute:defaultSelDate.br_minute second:defaultSelDate.br_second];
} else {
self.mSelectDate = defaultSelDate;
}
} else {
//
self.mSelectDate = [NSDate date];
}
}
BOOL selectLessThanMin = [self.mSelectDate br_compare:self.minDate format:self.selectDateFormatter] == NSOrderedAscending;
BOOL selectMoreThanMax = [self.mSelectDate br_compare:self.maxDate format:self.selectDateFormatter] == NSOrderedDescending;
if (selectLessThanMin) {
BRErrorLog(@"默认选择的日期不能小于最小日期!");
self.mSelectDate = self.minDate;
}
if (selectMoreThanMax) {
BRErrorLog(@"默认选择的日期不能大于最大日期!");
self.mSelectDate = self.maxDate;
}
if (!self.selectValue || ![self.selectValue isEqualToString:[self getNowString]]) {
self.mSelectValue = [NSDate br_getDateString:self.mSelectDate format:self.selectDateFormatter];
}
}
- (void)setupSelectDateFormatter:(BRDatePickerMode)mode {
switch (mode) {
case BRDatePickerModeDate:
{
self.selectDateFormatter = @"yyyy-MM-dd";
self.style = BRDatePickerStyleSystem;
_datePickerMode = UIDatePickerModeDate;
}
break;
case BRDatePickerModeDateAndTime:
{
self.selectDateFormatter = @"yyyy-MM-dd HH:mm";
self.style = BRDatePickerStyleSystem;
_datePickerMode = UIDatePickerModeDateAndTime;
}
break;
case BRDatePickerModeTime:
{
self.selectDateFormatter = @"HH:mm";
self.style = BRDatePickerStyleSystem;
_datePickerMode = UIDatePickerModeTime;
}
break;
case BRDatePickerModeCountDownTimer:
{
self.selectDateFormatter = @"HH:mm";
self.style = BRDatePickerStyleSystem;
_datePickerMode = UIDatePickerModeCountDownTimer;
}
break;
case BRDatePickerModeYMDHMS:
{
self.selectDateFormatter = @"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.selectDateFormatter = @"yyyy-MM-dd HH:mm";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getYearUnit], [self getMonthUnit], [self getDayUnit], [self getHourUnit], [self getMinuteUnit]];
}
break;
case BRDatePickerModeYMDH:
{
self.selectDateFormatter = @"yyyy-MM-dd HH";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getYearUnit], [self getMonthUnit], [self getDayUnit], [self getHourUnit]];
}
break;
case BRDatePickerModeMDHM:
{
self.selectDateFormatter = @"MM-dd HH:mm";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getMonthUnit], [self getDayUnit], [self getHourUnit], [self getMinuteUnit]];
}
break;
case BRDatePickerModeYMD:
{
self.selectDateFormatter = @"yyyy-MM-dd";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getYearUnit], [self getMonthUnit], [self getDayUnit]];
}
break;
case BRDatePickerModeYM:
{
self.selectDateFormatter = @"yyyy-MM";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getYearUnit], [self getMonthUnit]];
}
break;
case BRDatePickerModeY:
{
self.selectDateFormatter = @"yyyy";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getYearUnit]];
}
break;
case BRDatePickerModeMD:
{
self.selectDateFormatter = @"MM-dd";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getMonthUnit], [self getDayUnit]];
}
break;
case BRDatePickerModeHMS:
{
self.selectDateFormatter = @"HH:mm:ss";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getHourUnit], [self getMinuteUnit], [self getSecondUnit]];
}
break;
case BRDatePickerModeHM:
{
self.selectDateFormatter = @"HH:mm";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getHourUnit], [self getMinuteUnit]];
}
break;
case BRDatePickerModeMS:
{
self.selectDateFormatter = @"mm:ss";
self.style = BRDatePickerStyleCustom;
self.unitArr = @[[self getMinuteUnit], [self getSecondUnit]];
}
break;
default:
break;
}
}
#pragma mark -
- (void)initDateArray {
if (self.selectValue && [self.selectValue isEqualToString:[self getNowString]]) {
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;
}
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;
}
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;
}
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;
}
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];
}
}
#pragma mark -
- (void)reloadDateArrayWithUpdateMonth:(BOOL)updateMonth updateDay:(BOOL)updateDay updateHour:(BOOL)updateHour updateMinute:(BOOL)updateMinute updateSecond:(BOOL)updateSecond {
// 1. monthArr
if (self.yearArr.count == 0) {
return;
}
NSString *yearString = self.yearArr[self.yearIndex];
// yearString =
if (self.isAddToNow && [yearString isEqualToString:[self getNowString]]) {
self.monthArr = nil;
self.dayArr = nil;
self.hourArr = nil;
self.minuteArr = nil;
self.secondArr = nil;
return;
}
if (updateMonth) {
self.monthArr = [self getMonthArr:[yearString integerValue]];
}
// 2. dayArr
if (self.monthArr.count == 0) {
return;
}
NSString *monthString = self.monthArr[self.monthIndex];
// monthString =
if (self.isAddToNow && [monthString isEqualToString:[self getNowString]]) {
self.dayArr = nil;
self.hourArr = nil;
self.minuteArr = nil;
self.secondArr = nil;
return;
}
if (updateDay) {
self.dayArr = [self getDayArr:[yearString integerValue] month:[monthString integerValue]];
}
// 3. hourArr
if (self.dayArr.count == 0) {
return;
}
NSInteger day = [self.dayArr[self.dayIndex] integerValue];
if (updateHour) {
self.hourArr = [self getHourArr:[yearString integerValue] month:[monthString integerValue] day:day];
}
// 4. minuteArr
if (self.hourArr.count == 0) {
return;
}
NSString *hourString = self.hourArr[self.hourIndex];
// hourString =
if (self.isAddToNow && [hourString isEqualToString:[self getNowString]]) {
self.minuteArr = nil;
self.secondArr = nil;
return;
}
if (updateMinute) {
self.minuteArr = [self getMinuteArr:[yearString integerValue] month:[monthString integerValue] day:day hour:[hourString integerValue]];
}
// 5. secondArr
if (self.minuteArr.count == 0) {
return;
}
NSString *minuteString = self.minuteArr[self.minuteIndex];
// minuteString =
if (self.isAddToNow && [minuteString isEqualToString:[self getNowString]]) {
self.secondArr = nil;
return;
}
if (updateSecond) {
self.secondArr = [self getSecondArr:[yearString integerValue] month:[monthString integerValue] day:day hour:[hourString integerValue] minute:[minuteString integerValue]];
}
}
// yearArr
- (NSArray *)getYearArr {
NSMutableArray *tempArr = [NSMutableArray array];
for (NSInteger i = self.minDate.br_year; i <= self.maxDate.br_year; i++) {
[tempArr addObject:[@(i) stringValue]];
}
//
if (self.isAddToNow) {
switch (self.pickerMode) {
case BRDatePickerModeYMDHMS:
case BRDatePickerModeYMDHM:
case BRDatePickerModeYMDH:
case BRDatePickerModeYMD:
case BRDatePickerModeYM:
case BRDatePickerModeY:
{
[tempArr addObject:[self getNowString]];
}
break;
default:
break;
}
}
return [tempArr copy];
}
// monthArr
- (NSArray *)getMonthArr:(NSInteger)year {
NSInteger startMonth = 1;
NSInteger endMonth = 12;
if (year == self.minDate.br_year) {
startMonth = self.minDate.br_month;
}
if (year == self.maxDate.br_year) {
endMonth = self.maxDate.br_month;
}
NSMutableArray *tempArr = [NSMutableArray arrayWithCapacity:(endMonth - startMonth + 1)];
for (NSInteger i = startMonth; i <= endMonth; i++) {
[tempArr addObject:[@(i) stringValue]];
}
//
if (self.isAddToNow) {
switch (self.pickerMode) {
case BRDatePickerModeMDHM:
case BRDatePickerModeMD:
{
[tempArr addObject:[self getNowString]];
}
break;
default:
break;
}
}
return [tempArr copy];
}
// dayArr
- (NSArray *)getDayArr:(NSInteger)year month:(NSInteger)month {
NSInteger startDay = 1;
NSInteger endDay = [NSDate br_getDaysInYear:year month:month];
if (year == self.minDate.br_year && month == self.minDate.br_month) {
startDay = self.minDate.br_day;
}
if (year == self.maxDate.br_year && month == self.maxDate.br_month) {
endDay = self.maxDate.br_day;
}
NSMutableArray *tempArr = [NSMutableArray array];
for (NSInteger i = startDay; i <= endDay; i++) {
[tempArr addObject:[NSString stringWithFormat:@"%@", @(i)]];
}
return [tempArr copy];
}
// hourArr
- (NSArray *)getHourArr:(NSInteger)year month:(NSInteger)month day:(NSInteger)day {
NSInteger startHour = 0;
NSInteger endHour = 23;
if (year == self.minDate.br_year && month == self.minDate.br_month && day == self.minDate.br_day) {
startHour = self.minDate.br_hour;
}
if (year == self.maxDate.br_year && month == self.maxDate.br_month && day == self.maxDate.br_day) {
endHour = self.maxDate.br_hour;
}
NSMutableArray *tempArr = [NSMutableArray arrayWithCapacity:(endHour - startHour + 1)];
for (NSInteger i = startHour; i <= endHour; i++) {
[tempArr addObject:[@(i) stringValue]];
}
//
if (self.isAddToNow) {
switch (self.pickerMode) {
case BRDatePickerModeHMS:
case BRDatePickerModeHM:
{
[tempArr addObject:[self getNowString]];
}
break;
default:
break;
}
}
return [tempArr copy];
}
// minuteArr
- (NSArray *)getMinuteArr:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour {
NSInteger startMinute = 0;
NSInteger endMinute = 59;
if (year == self.minDate.br_year && month == self.minDate.br_month && day == self.minDate.br_day && hour == self.minDate.br_hour) {
startMinute = self.minDate.br_minute;
}
if (year == self.maxDate.br_year && month == self.maxDate.br_month && day == self.maxDate.br_day && hour == self.maxDate.br_hour) {
endMinute = self.maxDate.br_minute;
}
NSMutableArray *tempArr = [NSMutableArray arrayWithCapacity:(endMinute - startMinute + 1)];
for (NSInteger i = startMinute; i <= endMinute; i += self.minuteInterval) {
[tempArr addObject:[@(i) stringValue]];
}
//
if (self.isAddToNow) {
switch (self.pickerMode) {
case BRDatePickerModeMS:
{
[tempArr addObject:[self getNowString]];
}
break;
default:
break;
}
}
return [tempArr copy];
}
// secondArr
- (NSArray *)getSecondArr:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute {
NSInteger startSecond = 0;
NSInteger endSecond = 59;
if (year == self.minDate.br_year && month == self.minDate.br_month && day == self.minDate.br_day && hour == self.minDate.br_hour && minute == self.minDate.br_minute) {
startSecond = self.minDate.br_second;
}
if (year == self.maxDate.br_year && month == self.maxDate.br_month && day == self.maxDate.br_day && hour == self.maxDate.br_hour && minute == self.maxDate.br_minute) {
endSecond = self.maxDate.br_second;
}
NSMutableArray *tempArr = [NSMutableArray arrayWithCapacity:(endSecond - startSecond + 1)];
for (NSInteger i = startSecond; i <= endSecond; i += self.secondInterval) {
[tempArr addObject:[@(i) stringValue]];
}
return [tempArr copy];
}
#pragma mark -
- (void)scrollToSelectDate:(NSDate *)selectDate animated:(BOOL)animated {
//
NSInteger yearIndex = selectDate.br_year - self.minDate.br_year;
NSInteger monthIndex = selectDate.br_month - ((yearIndex == 0) ? self.minDate.br_month : 1);
NSInteger dayIndex = selectDate.br_day - ((yearIndex == 0 && monthIndex == 0) ? self.minDate.br_day : 1);
NSInteger hourIndex = selectDate.br_hour - ((yearIndex == 0 && monthIndex == 0 && dayIndex == 0) ? self.minDate.br_hour : 0);
NSInteger minuteIndex = selectDate.br_minute - ((yearIndex == 0 && monthIndex == 0 && dayIndex == 0 && hourIndex == 0) ? self.minDate.br_minute : 0);
NSUInteger secondIndex = selectDate.br_second - ((yearIndex == 0 && monthIndex == 0 && dayIndex == 0 && hourIndex == 0 && minuteIndex == 0) ? self.minDate.br_second : 0);
self.yearIndex = yearIndex;
self.monthIndex = monthIndex;
self.dayIndex = dayIndex;
self.hourIndex = hourIndex;
if (self.minuteInterval > 1) {
if (selectDate.br_minute % self.minuteInterval == 0 && self.minDate.br_minute % self.minuteInterval == 0) {
minuteIndex = minuteIndex / self.minuteInterval;
} else {
minuteIndex = 0;
}
}
self.minuteIndex = minuteIndex;
if (self.secondInterval > 1) {
if (selectDate.br_second % self.secondInterval == 0 && self.minDate.br_second % self.secondInterval == 0) {
secondIndex = secondIndex / self.secondInterval;
} else {
secondIndex = 0;
}
}
self.secondIndex = secondIndex;
NSArray *indexArr = [NSArray array];
if (self.pickerMode == BRDatePickerModeYMDHMS) {
indexArr = @[@(yearIndex), @(monthIndex), @(dayIndex), @(hourIndex), @(minuteIndex), @(secondIndex)];
} else if (self.pickerMode == BRDatePickerModeYMDHM) {
indexArr = @[@(yearIndex), @(monthIndex), @(dayIndex), @(hourIndex), @(minuteIndex)];
} else if (self.pickerMode == BRDatePickerModeYMDH) {
indexArr = @[@(yearIndex), @(monthIndex), @(dayIndex), @(hourIndex)];
} else if (self.pickerMode == BRDatePickerModeMDHM) {
indexArr = @[@(monthIndex), @(dayIndex), @(hourIndex), @(minuteIndex)];
} else if (self.pickerMode == BRDatePickerModeYMD) {
indexArr = @[@(yearIndex), @(monthIndex), @(dayIndex)];
} else if (self.pickerMode == BRDatePickerModeYM) {
indexArr = @[@(yearIndex), @(monthIndex)];
} else if (self.pickerMode == BRDatePickerModeY) {
indexArr = @[@(yearIndex)];
} else if (self.pickerMode == BRDatePickerModeMD) {
indexArr = @[@(monthIndex), @(dayIndex)];
} else if (self.pickerMode == BRDatePickerModeHMS) {
indexArr = @[@(hourIndex), @(minuteIndex), @(secondIndex)];
} else if (self.pickerMode == BRDatePickerModeHM) {
indexArr = @[@(hourIndex), @(minuteIndex)];
} else if (self.pickerMode == BRDatePickerModeMS) {
indexArr = @[@(minuteIndex), @(secondIndex)];
}
for (NSInteger i = 0; i < indexArr.count; i++) {
[self.pickerView selectRow:[indexArr[i] integerValue] inComponent:i animated:animated];
}
}
#pragma mark -
- (void)scrollToNowDate:(BOOL)animated {
switch (self.pickerMode) {
case BRDatePickerModeYMDHMS:
case BRDatePickerModeYMDHM:
case BRDatePickerModeYMDH:
case BRDatePickerModeYMD:
case BRDatePickerModeYM:
case BRDatePickerModeY:
{
NSInteger yearIndex = self.yearArr.count > 0 ? self.yearArr.count - 1 : 0;
[self.pickerView selectRow:yearIndex inComponent:0 animated:animated];
}
break;
case BRDatePickerModeMDHM:
case BRDatePickerModeMD:
{
NSInteger monthIndex = 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.hourArr.count > 0 ? self.hourArr.count - 1 : 0;
[self.pickerView selectRow:hourIndex inComponent:0 animated:animated];
}
break;
case BRDatePickerModeMS:
{
NSInteger minuteIndex = 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) {
_datePicker = [[UIDatePicker alloc]initWithFrame:CGRectMake(0, self.pickerStyle.titleBarHeight, SCREEN_WIDTH, self.pickerStyle.pickerHeight)];
_datePicker.backgroundColor = self.pickerStyle.pickerColor;
_datePicker.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth;
_datePicker.datePickerMode = _datePickerMode;
// UIDatePicker Locale
_datePicker.locale = [[NSLocale alloc]initWithLocaleIdentifier:self.pickerStyle.language];
// textColor 使KVC
[_datePicker setValue:self.pickerStyle.pickerTextColor forKey:@"textColor"];
/*
// NSInvocation
SEL selector= NSSelectorFromString(@"setHighlightsToday:");
// NSInvocation
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDatePicker instanceMethodSignatureForSelector:selector]];
BOOL no = NO;
[invocation setSelector:selector];
[invocation setArgument:&no atIndex:2];
// invocationsetHighlightsToday
[invocation invokeWithTarget:_datePicker];
// 线
for (UIView *view in _datePicker.subviews) {
if ([view isKindOfClass:[UIView class]]) {
for (UIView *subView in view.subviews) {
if (subView.frame.size.height < 1) {
subView.backgroundColor = self.pickerStyle.separatorColor;
}
}
}
}
*/
//
if (self.minDate) {
_datePicker.minimumDate = self.minDate;
}
if (self.maxDate) {
_datePicker.maximumDate = self.maxDate;
}
//
[_datePicker addTarget:self action:@selector(didSelectValueChanged:) forControlEvents:UIControlEventValueChanged];
}
return _datePicker;
}
#pragma mark - 2
- (UIPickerView *)pickerView {
if (!_pickerView) {
_pickerView = [[UIPickerView alloc]initWithFrame:CGRectMake(0, self.pickerStyle.titleBarHeight, SCREEN_WIDTH, self.pickerStyle.pickerHeight)];
_pickerView.backgroundColor = self.pickerStyle.pickerColor;
_pickerView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth;
_pickerView.dataSource = self;
_pickerView.delegate = self;
_pickerView.showsSelectionIndicator = YES;
}
return _pickerView;
}
#pragma mark - UIPickerViewDataSource
// 1. picker
- (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;
}
return 0;
}
// 2. picker
- (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) {
rowsArr = @[@(self.yearArr.count), @(self.monthArr.count), @(self.dayArr.count)];
} else if (self.pickerMode == BRDatePickerModeYM) {
rowsArr = @[@(self.yearArr.count), @(self.monthArr.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)];
}
return [rowsArr[component] integerValue];
}
#pragma mark - UIPickerViewDelegate
// 3. picker
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view {
// 线
for (UIView *subView in pickerView.subviews) {
if (subView && [subView isKindOfClass:[UIView class]] && subView.frame.size.height <= 1) {
subView.backgroundColor = self.pickerStyle.separatorColor;
}
}
//
NSArray *subviews = pickerView.subviews;
if (subviews.count > 0) {
NSArray *coloms = subviews.firstObject;
if (coloms) {
NSArray *subviewCache = [coloms valueForKey:@"subviewCache"];
if (subviewCache.count > 0) {
UIView *middleContainerView = [subviewCache.firstObject valueForKey:@"middleContainerView"];
if (middleContainerView) {
middleContainerView.backgroundColor = self.pickerStyle.selectedColor;
}
}
}
}
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
if (self.pickerMode == BRDatePickerModeYMDHMS) {
if (component == 0) {
label.text = [self getYearText:row];
} else if (component == 1) {
label.text = [self getMonthText:row];
} else if (component == 2) {
label.text = [self getDayText:row];
} else if (component == 3) {
label.text = [self getHourText:row];
} else if (component == 4) {
label.text = [self getMinuteText:row];
} else if (component == 5) {
label.text = [self getSecondText:row];
}
} else if (self.pickerMode == BRDatePickerModeYMDHM) {
if (component == 0) {
label.text = [self getYearText:row];
} else if (component == 1) {
label.text = [self getMonthText:row];
} else if (component == 2) {
label.text = [self getDayText:row];
} else if (component == 3) {
label.text = [self getHourText:row];
} else if (component == 4) {
label.text = [self getMinuteText:row];
}
} else if (self.pickerMode == BRDatePickerModeYMDH) {
if (component == 0) {
label.text = [self getYearText:row];
} else if (component == 1) {
label.text = [self getMonthText:row];
} else if (component == 2) {
label.text = [self getDayText:row];
} else if (component == 3) {
label.text = [self getHourText:row];
}
} else if (self.pickerMode == BRDatePickerModeMDHM) {
if (component == 0) {
label.text = [self getMonthText:row];
} else if (component == 1) {
label.text = [self getDayText:row];
} else if (component == 2) {
label.text = [self getHourText:row];
} else if (component == 3) {
label.text = [self getMinuteText:row];
}
} else if (self.pickerMode == BRDatePickerModeYMD) {
if (component == 0) {
label.text = [self getYearText:row];
} else if (component == 1) {
label.text = [self getMonthText:row];
} else if (component == 2) {
label.text = [self getDayText:row];
}
} else if (self.pickerMode == BRDatePickerModeYM) {
if (component == 0) {
label.text = [self getYearText:row];
} else if (component == 1) {
label.text = [self getMonthText:row];
}
} else if (self.pickerMode == BRDatePickerModeY) {
if (component == 0) {
label.text = [self getYearText:row];
}
} else if (self.pickerMode == BRDatePickerModeMD) {
if (component == 0) {
label.text = [self getMonthText:row];
} else if (component == 1) {
label.text = [self getDayText:row];
}
} else if (self.pickerMode == BRDatePickerModeHMS) {
if (component == 0) {
label.text = [self getHourText:row];
} else if (component == 1) {
label.text = [self getMinuteText:row];
} else if (component == 2) {
label.text = [self getSecondText:row];
}
} else if (self.pickerMode == BRDatePickerModeHM) {
if (component == 0) {
label.text = [self getHourText:row];
} else if (component == 1) {
label.text = [self getMinuteText:row];
}
} else if (self.pickerMode == BRDatePickerModeMS) {
if (component == 0) {
label.text = [self getMinuteText:row];
} else if (component == 1) {
label.text = [self getSecondText:row];
}
}
return label;
}
// 4. 2
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
NSString *lastSelectValue = self.mSelectValue;
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.yearArr[self.yearIndex];
if (![yearString isEqualToString:[self getNowString]]) {
if (self.yearArr.count * self.monthArr.count * self.dayArr.count * self.hourArr.count * self.minuteArr.count * self.secondArr.count == 0) return;
int year = [self.yearArr[self.yearIndex] intValue];
int month = [self.monthArr[self.monthIndex] intValue];
int day = [self.dayArr[self.dayIndex] intValue];
int hour = [self.hourArr[self.hourIndex] intValue];
int minute = [self.minuteArr[self.minuteIndex] intValue];
int second = [self.secondArr[self.secondIndex] 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 = [NSDate date];
self.mSelectValue = [self getNowString];
}
} 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.yearArr[self.yearIndex];
if (![yearString isEqualToString:[self getNowString]]) {
if (self.yearArr.count * self.monthArr.count * self.dayArr.count * self.hourArr.count * self.minuteArr.count == 0) return;
int year = [self.yearArr[self.yearIndex] intValue];
int month = [self.monthArr[self.monthIndex] intValue];
int day = [self.dayArr[self.dayIndex] intValue];
int hour = [self.hourArr[self.hourIndex] intValue];
int minute = [self.minuteArr[self.minuteIndex] 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 = [NSDate date];
self.mSelectValue = [self getNowString];
}
} 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.yearArr[self.yearIndex];
if (![yearString isEqualToString:[self getNowString]]) {
if (self.yearArr.count * self.monthArr.count * self.dayArr.count * self.hourArr.count == 0) return;
int year = [self.yearArr[self.yearIndex] intValue];
int month = [self.monthArr[self.monthIndex] intValue];
int day = [self.dayArr[self.dayIndex] intValue];
int hour = [self.hourArr[self.hourIndex] intValue];
self.mSelectDate = [NSDate br_setYear:year month:month day:day hour:hour];
self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d-%02d %02d", year, month, day, hour];
} else {
self.mSelectDate = [NSDate date];
self.mSelectValue = [self getNowString];
}
} 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.monthArr[self.monthIndex];
if (![monthString isEqualToString:[self getNowString]]) {
if (self.monthArr.count * self.dayArr.count * self.hourArr.count * self.minuteArr.count == 0) return;
int month = [self.monthArr[self.monthIndex] intValue];
int day = [self.dayArr[self.dayIndex] intValue];
int hour = [self.hourArr[self.hourIndex] intValue];
int minute = [self.minuteArr[self.minuteIndex] intValue];
self.mSelectDate = [NSDate br_setMonth:month day:day hour:hour minute:minute];
self.mSelectValue = [NSString stringWithFormat:@"%02d-%02d %02d:%02d", month, day, hour, minute];
} else {
self.mSelectDate = [NSDate date];
self.mSelectValue = [self getNowString];
}
} else if (self.pickerMode == BRDatePickerModeYMD) {
if (component == 0) {
self.yearIndex = row;
[self reloadDateArrayWithUpdateMonth:YES updateDay:YES updateHour:NO updateMinute:NO updateSecond:NO];
[self.pickerView reloadComponent:1];
[self.pickerView reloadComponent:2];
} else if (component == 1) {
self.monthIndex = row;
[self reloadDateArrayWithUpdateMonth:NO updateDay:YES updateHour:NO updateMinute:NO updateSecond:NO];
[self.pickerView reloadComponent:2];
} else if (component == 2) {
self.dayIndex = row;
}
NSString *yearString = self.yearArr[self.yearIndex];
if (![yearString isEqualToString:[self getNowString]]) {
if (self.yearArr.count * self.monthArr.count * self.dayArr.count == 0) return;
int year = [self.yearArr[self.yearIndex] intValue];
int month = [self.monthArr[self.monthIndex] intValue];
int day = [self.dayArr[self.dayIndex] intValue];
self.mSelectDate = [NSDate br_setYear:year month:month day:day];
self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d-%02d", year, month, day];
} else {
self.mSelectDate = [NSDate date];
self.mSelectValue = [self getNowString];
}
} else if (self.pickerMode == BRDatePickerModeYM) {
if (component == 0) {
self.yearIndex = row;
[self reloadDateArrayWithUpdateMonth:YES updateDay:NO updateHour:NO updateMinute:NO updateSecond:NO];
[self.pickerView reloadComponent:1];
} else if (component == 1) {
self.monthIndex = row;
}
NSString *yearString = self.yearArr[self.yearIndex];
if (![yearString isEqualToString:[self getNowString]]) {
if (self.yearArr.count * self.monthArr.count == 0) return;
int year = [self.yearArr[self.yearIndex] intValue];
int month = [self.monthArr[self.monthIndex] intValue];
self.mSelectDate = [NSDate br_setYear:year month:month];
self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d", year, month];
} else {
self.mSelectDate = [NSDate date];
self.mSelectValue = [self getNowString];
}
} else if (self.pickerMode == BRDatePickerModeY) {
if (component == 0) {
self.yearIndex = row;
}
NSString *yearString = self.yearArr[self.yearIndex];
if (![yearString isEqualToString:[self getNowString]]) {
if (self.yearArr.count == 0) return;
int year = [self.yearArr[self.yearIndex] intValue];
self.mSelectDate = [NSDate br_setYear:year];
self.mSelectValue = [NSString stringWithFormat:@"%04d", year];
} else {
self.mSelectDate = [NSDate date];
self.mSelectValue = [self getNowString];
}
} 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.monthArr[self.monthIndex];
if (![monthString isEqualToString:[self getNowString]]) {
if (self.monthArr.count * self.dayArr.count == 0) return;
int month = [self.monthArr[self.monthIndex] intValue];
int day = [self.dayArr[self.dayIndex] intValue];
self.mSelectDate = [NSDate br_setMonth:month day:day];
self.mSelectValue = [NSString stringWithFormat:@"%02d-%02d", month, day];
} else {
self.mSelectDate = [NSDate date];
self.mSelectValue = [self getNowString];
}
} 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.hourArr[self.hourIndex];
if (![hourString isEqualToString:[self getNowString]]) {
if (self.hourArr.count * self.minuteArr.count * self.secondArr.count == 0) return;
int hour = [self.hourArr[self.hourIndex] intValue];
int minute = [self.minuteArr[self.minuteIndex] intValue];
int second = [self.secondArr[self.secondIndex] intValue];
self.mSelectDate = [NSDate br_setHour:hour minute:minute second:second];
self.mSelectValue = [NSString stringWithFormat:@"%02d:%02d:%02d", hour, minute, second];
} else {
self.mSelectDate = [NSDate date];
self.mSelectValue = [self getNowString];
}
} 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.hourArr[self.hourIndex];
if (![hourString isEqualToString:[self getNowString]]) {
if (self.hourArr.count * self.minuteArr.count == 0) return;
int hour = [self.hourArr[self.hourIndex] intValue];
int minute = [self.minuteArr[self.minuteIndex] intValue];
self.mSelectDate = [NSDate br_setHour:hour minute:minute];
self.mSelectValue = [NSString stringWithFormat:@"%02d:%02d", hour, minute];
} else {
self.mSelectDate = [NSDate date];
self.mSelectValue = [self getNowString];
}
} 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.minuteArr[self.minuteIndex];
if (![minuteString isEqualToString:[self getNowString]]) {
if (self.minuteArr.count * self.secondArr.count == 0) return;
int minute = [self.minuteArr[self.minuteIndex] intValue];
int second = [self.secondArr[self.secondIndex] intValue];
self.mSelectDate = [NSDate br_setMinute:minute second:second];
self.mSelectValue = [NSString stringWithFormat:@"%02d:%02d", minute, second];
} else {
self.mSelectDate = [NSDate date];
self.mSelectValue = [self getNowString];
}
}
//
if ([lastSelectValue isEqualToString:[self getNowString]] && ![self.mSelectValue isEqualToString:[self getNowString]]) {
[self scrollToSelectDate:self.mSelectDate animated:NO];
}
// changeBlock
if (self.changeBlock) {
self.changeBlock(self.mSelectDate, self.mSelectValue);
}
// resultBlock
if (self.isAutoSelect) {
// block
if (self.resultBlock) {
self.resultBlock(self.mSelectDate, 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;
BOOL selectLessThanMin = [self.mSelectDate br_compare:self.minDate format:self.selectDateFormatter] == NSOrderedAscending;
BOOL selectMoreThanMax = [self.mSelectDate br_compare:self.maxDate format:self.selectDateFormatter] == NSOrderedDescending;
if (selectLessThanMin) {
self.mSelectDate = self.minDate;
}
if (selectMoreThanMax) {
self.mSelectDate = self.maxDate;
}
[self.datePicker setDate:self.mSelectDate animated:YES];
self.mSelectValue = [NSDate br_getDateString:self.mSelectDate format:self.selectDateFormatter];
// changeBlock
if (self.changeBlock) {
self.changeBlock(self.mSelectDate, self.mSelectValue);
}
// resultBlock
if (self.isAutoSelect) {
// block
if (self.resultBlock) {
self.resultBlock(self.mSelectDate, self.mSelectValue);
}
}
}
#pragma mark -
- (void)addPickerToView:(UIView *)view {
[self handlerPickerData];
//
if (self.style == BRDatePickerStyleSystem) {
[self setPickerView:self.datePicker toView:view];
} else if (self.style == BRDatePickerStyleCustom) {
[self setPickerView:self.pickerView toView:view];
if (self.showUnitType == BRShowUnitTypeSingleRow) {
//
[self addUnitLabelToPickerView:view];
}
}
//
if (self.style == BRDatePickerStyleSystem) {
[self.datePicker setDate:self.mSelectDate animated:NO];
} else if (self.style == BRDatePickerStyleCustom) {
if (self.selectValue && [self.selectValue isEqualToString:[self getNowString]]) {
[self scrollToNowDate:NO];
} else {
[self scrollToSelectDate:self.mSelectDate animated:NO];
}
}
__weak typeof(self) weakSelf = self;
self.doneBlock = ^{
// block
[weakSelf removePickerFromView:view];
if (weakSelf.resultBlock) {
weakSelf.resultBlock(weakSelf.mSelectDate, weakSelf.mSelectValue);
}
};
[super addPickerToView:view];
}
- (void)setPickerView:(UIView *)pickerView toView:(UIView *)view {
if (view) {
// view view 使
[view setNeedsLayout];
[view layoutIfNeeded];
self.frame = view.bounds;
pickerView.frame = view.bounds;
[self addSubview:pickerView];
} else {
[self.alertView addSubview:pickerView];
}
}
#pragma mark -
- (void)addUnitLabelToPickerView:(UIView *)view {
for (NSInteger i = 0; i < self.pickerView.numberOfComponents; i++) {
// label
CGFloat labelWidth = self.pickerView.bounds.size.width / self.pickerView.numberOfComponents;
//
NSString *tempText = @"00";
if (i == 0) {
switch (self.pickerMode) {
case BRDatePickerModeYMDHMS:
case BRDatePickerModeYMDHM:
case BRDatePickerModeYMDH:
case BRDatePickerModeYMD:
case BRDatePickerModeYM:
case BRDatePickerModeY:
{
tempText = @"0000";
}
break;
default:
break;
}
}
//
CGFloat labelTextWidth = [tempText boundingRectWithSize:CGSizeMake(MAXFLOAT, self.pickerStyle.rowHeight)
options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
attributes:@{NSFontAttributeName: self.pickerStyle.pickerTextFont}
context:nil].size.width;
// label
UILabel *unitLabel = [[UILabel alloc]init];
unitLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
unitLabel.backgroundColor = [UIColor clearColor];
unitLabel.textAlignment = NSTextAlignmentCenter;
unitLabel.font = self.pickerStyle.dateUnitTextFont;
unitLabel.textColor = self.pickerStyle.dateUnitTextColor;
//
unitLabel.adjustsFontSizeToFitWidth = YES;
//
unitLabel.minimumScaleFactor = 0.5f;
unitLabel.text = (self.unitArr.count > 0 && i < self.unitArr.count) ? self.unitArr[i] : nil;
CGFloat originX = i * labelWidth + labelWidth / 2.0 + labelTextWidth / 2.0 + self.pickerStyle.dateUnitOffsetX;
if (self.pickerStyle.horizontalCenter) {
originX = i * labelWidth + labelWidth / 2.0 - self.pickerStyle.rowHeight / 2.0;
}
CGFloat originY = (self.pickerStyle.pickerHeight - self.pickerStyle.rowHeight) / 2 + self.pickerStyle.dateUnitOffsetY;
if (view) {
if (self.style == BRDatePickerStyleSystem) {
[self.datePicker addSubview:unitLabel];
} else if (self.style == BRDatePickerStyleCustom) {
[self.pickerView addSubview:unitLabel];
}
} else {
originY = self.pickerStyle.titleBarHeight + originY;
[self.alertView addSubview:unitLabel];
}
unitLabel.frame = CGRectMake(originX, originY, self.pickerStyle.rowHeight, self.pickerStyle.rowHeight);
}
}
#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];
}
- (NSString *)getNowString {
return [NSBundle br_localizedStringForKey:@"至今" language:self.pickerStyle.language];
}
- (NSString *)getYearText:(NSInteger)row {
NSString *yearString = self.yearArr[row];
if ([yearString isEqualToString:[self getNowString]]) {
return yearString;
}
NSString *yearUnit = self.showUnitType == BRShowUnitTypeAll ? [self getYearUnit] : @"";
return [NSString stringWithFormat:@"%@%@", yearString, yearUnit];
}
- (NSString *)getMonthText:(NSInteger)row {
NSString *monthString = self.monthArr[row];
if ([monthString isEqualToString:[self getNowString]]) {
return monthString;
}
NSString *monthUnit = self.showUnitType == BRShowUnitTypeAll ? [self getMonthUnit] : @"";
return [NSString stringWithFormat:@"%@%@", monthString, monthUnit];
}
- (NSString *)getDayText:(NSInteger)row {
NSString *dayString = self.dayArr[row];
if (self.isShowToday && self.mSelectDate.br_year == [NSDate date].br_year && self.mSelectDate.br_month == [NSDate date].br_month && [dayString integerValue] == [NSDate date].br_day) {
return [NSBundle br_localizedStringForKey:@"今天" language:self.pickerStyle.language];
}
NSString *dayUnit = self.showUnitType == BRShowUnitTypeAll ? [self getDayUnit] : @"";
dayString = [NSString stringWithFormat:@"%@%@", dayString, dayUnit];
if (self.isShowWeek) {
dayString = [NSString stringWithFormat:@"%@%@", dayString, [self getWeekday:row]];
}
return dayString;
}
- (NSString *)getHourText:(NSInteger)row {
NSString *hourString = self.hourArr[row];
if ([hourString isEqualToString:[self getNowString]]) {
return hourString;
}
NSString *hourUnit = self.showUnitType == BRShowUnitTypeAll ? [self getHourUnit] : @"";
return [NSString stringWithFormat:@"%@%@", hourString, hourUnit];
}
- (NSString *)getMinuteText:(NSInteger)row {
NSString *minuteUnit = self.showUnitType == BRShowUnitTypeAll ? [self getMinuteUnit] : @"";
return [NSString stringWithFormat:@"%@%@", self.minuteArr[row], minuteUnit];
}
- (NSString *)getSecondText:(NSInteger)row {
NSString *secondUnit = self.showUnitType == BRShowUnitTypeAll ? [self getSecondUnit] : @"";
return [NSString stringWithFormat:@"%@%@", self.secondArr[row], secondUnit];
}
- (NSString *)getWeekday:(NSInteger)dayRow {
NSInteger day = [self.dayArr[dayRow] integerValue];
NSDate *date = [NSDate br_setYear:self.mSelectDate.br_year month:self.mSelectDate.br_month day:day];
return [NSBundle br_localizedStringForKey:[date br_weekdayString] language:self.pickerStyle.language];
}
- (NSString *)getYearUnit {
return [NSBundle br_localizedStringForKey:@"年" language:self.pickerStyle.language];
}
- (NSString *)getMonthUnit {
return [NSBundle br_localizedStringForKey:@"月" language:self.pickerStyle.language];
}
- (NSString *)getDayUnit {
return [NSBundle br_localizedStringForKey:@"日" language:self.pickerStyle.language];
}
- (NSString *)getHourUnit {
return [NSBundle br_localizedStringForKey:@"时" language:self.pickerStyle.language];
}
- (NSString *)getMinuteUnit {
return [NSBundle br_localizedStringForKey:@"分" language:self.pickerStyle.language];
}
- (NSString *)getSecondUnit {
return [NSBundle br_localizedStringForKey:@"秒" language:self.pickerStyle.language];
}
#pragma mark - setter
- (void)setPickerMode:(BRDatePickerMode)pickerMode {
_pickerMode = pickerMode;
//
if (_datePicker || _pickerView) {
[self handlerPickerData];
[self.pickerView reloadAllComponents];
//
if (self.style == BRDatePickerStyleSystem) {
[self.datePicker setDate:self.mSelectDate animated:NO];
} else if (self.style == BRDatePickerStyleCustom) {
[self scrollToSelectDate:self.mSelectDate animated:NO];
}
}
}
- (void)setAddToNow:(BOOL)addToNow {
_addToNow = addToNow;
if (addToNow) {
_maxDate = [NSDate date];
}
}
- (void)setMaxDate:(NSDate *)maxDate {
// addToNow YES maxDate = [NSDate date];
if (!self.isAddToNow) {
_maxDate = maxDate;
}
}
//
- (void)setSelectDate:(NSDate *)selectDate {
_selectDate = selectDate;
_mSelectDate = selectDate;
if (_datePicker || _pickerView) {
//
[self handlerDefaultSelectDate];
if (self.style == BRDatePickerStyleCustom) {
[self initDateArray];
}
[self.pickerView reloadAllComponents];
//
if (self.style == BRDatePickerStyleSystem) {
[self.datePicker setDate:self.mSelectDate animated:NO];
} else if (self.style == BRDatePickerStyleCustom) {
[self scrollToSelectDate:self.mSelectDate animated:NO];
}
}
}
- (void)setSelectValue:(NSString *)selectValue {
_selectValue = selectValue;
_mSelectValue = selectValue;
if (_datePicker || _pickerView) {
//
[self handlerDefaultSelectDate];
if (self.style == BRDatePickerStyleCustom) {
[self initDateArray];
}
[self.pickerView reloadAllComponents];
//
if (self.style == BRDatePickerStyleSystem) {
[self.datePicker setDate:self.mSelectDate animated:NO];
} else if (self.style == BRDatePickerStyleCustom) {
[self scrollToSelectDate:self.mSelectDate animated:NO];
}
}
}
- (void)setHiddenDateUnit:(BOOL)hiddenDateUnit {
if (hiddenDateUnit) {
self.showUnitType = BRShowUnitTypeNone;
}
}
#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)yearIndex {
if (_yearIndex < 0) {
_yearIndex = 0;
} else {
_yearIndex = MIN(_yearIndex, self.yearArr.count - 1);
}
return _yearIndex;
}
- (NSInteger)monthIndex {
if (_monthIndex < 0) {
_monthIndex = 0;
} else {
_monthIndex = MIN(_monthIndex, self.monthArr.count - 1);
}
return _monthIndex;
}
- (NSInteger)dayIndex {
if (_dayIndex < 0) {
_dayIndex = 0;
} else {
_dayIndex = MIN(_dayIndex, self.dayArr.count - 1);
}
return _dayIndex;
}
- (NSInteger)hourIndex {
if (_hourIndex < 0) {
_hourIndex = 0;
} else {
_hourIndex = MIN(_hourIndex, self.hourArr.count - 1);
}
return _hourIndex;
}
- (NSInteger)minuteIndex {
if (_minuteIndex < 0) {
_minuteIndex = 0;
} else {
_minuteIndex = MIN(_minuteIndex, self.minuteArr.count - 1);
}
return _minuteIndex;
}
- (NSInteger)secondIndex {
if (_secondIndex < 0) {
_secondIndex = 0;
} else {
_secondIndex = MIN(_secondIndex, self.secondArr.count - 1);
}
return _secondIndex;
}
- (NSInteger)minuteInterval {
if (_minuteInterval < 1 || _minuteInterval >= 59) {
_minuteInterval = 1;
}
return _minuteInterval;
}
- (NSInteger)secondInterval {
if (_secondInterval < 1 || _secondInterval >= 59) {
_secondInterval = 1;
}
return _secondInterval;
}
- (NSArray *)unitArr {
if (!_unitArr) {
_unitArr = [NSArray array];
}
return _unitArr;
}
@end