BRDatePickerView.m 67 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557
  1. //
  2. // BRDatePickerView.m
  3. // BRPickerViewDemo
  4. //
  5. // Created by renbo on 2017/8/11.
  6. // Copyright © 2017 irenb. All rights reserved.
  7. //
  8. // 最新代码下载地址:https://github.com/91renb/BRPickerView
  9. #import "BRDatePickerView.h"
  10. #import "NSBundle+BRPickerView.h"
  11. #import "BRDatePickerView+BR.h"
  12. /// 日期选择器的类型
  13. typedef NS_ENUM(NSInteger, BRDatePickerStyle) {
  14. BRDatePickerStyleSystem, // 系统样式:使用 UIDatePicker
  15. BRDatePickerStyleCustom // 自定义样式:使用 UIPickerView
  16. };
  17. @interface BRDatePickerView ()<UIPickerViewDataSource, UIPickerViewDelegate>
  18. {
  19. UIDatePickerMode _datePickerMode;
  20. UIView *_containerView;
  21. BOOL _isAdjustSelectRow; // 设置minDate时,调整日期联动的选择(解决日期选择器联动不正确的问题)
  22. }
  23. /** 日期选择器1 */
  24. @property (nonatomic, strong) UIDatePicker *datePicker;
  25. /** 日期选择器2 */
  26. @property (nonatomic, strong) UIPickerView *pickerView;
  27. /// 日期存储数组
  28. @property(nonatomic, copy) NSArray *yearArr;
  29. @property(nonatomic, copy) NSArray *monthArr;
  30. @property(nonatomic, copy) NSArray *dayArr;
  31. @property(nonatomic, copy) NSArray *hourArr;
  32. @property(nonatomic, copy) NSArray *minuteArr;
  33. @property(nonatomic, copy) NSArray *secondArr;
  34. /// 记录 年、月、日、时、分、秒 当前选择的位置
  35. @property(nonatomic, assign) NSInteger yearIndex;
  36. @property(nonatomic, assign) NSInteger monthIndex;
  37. @property(nonatomic, assign) NSInteger dayIndex;
  38. @property(nonatomic, assign) NSInteger hourIndex;
  39. @property(nonatomic, assign) NSInteger minuteIndex;
  40. @property(nonatomic, assign) NSInteger secondIndex;
  41. // 记录选择的值
  42. @property (nonatomic, strong) NSDate *mSelectDate;
  43. @property (nonatomic, copy) NSString *mSelectValue;
  44. /** 日期选择器的类型 */
  45. @property (nonatomic, assign) BRDatePickerStyle style;
  46. /** 日期的格式 */
  47. @property (nonatomic, copy) NSString *dateFormatter;
  48. /** 单位数组 */
  49. @property (nonatomic, copy) NSArray *unitArr;
  50. /** 单位label数组 */
  51. @property (nonatomic, copy) NSArray <UILabel *> *unitLabelArr;
  52. @end
  53. @implementation BRDatePickerView
  54. #pragma mark - 1.显示日期选择器
  55. + (void)showDatePickerWithMode:(BRDatePickerMode)mode
  56. title:(NSString *)title
  57. selectValue:(NSString *)selectValue
  58. resultBlock:(BRDateResultBlock)resultBlock {
  59. [self showDatePickerWithMode:mode title:title selectValue:selectValue minDate:nil maxDate:nil isAutoSelect:NO resultBlock:resultBlock];
  60. }
  61. #pragma mark - 2.显示日期选择器
  62. + (void)showDatePickerWithMode:(BRDatePickerMode)mode
  63. title:(NSString *)title
  64. selectValue:(NSString *)selectValue
  65. isAutoSelect:(BOOL)isAutoSelect
  66. resultBlock:(BRDateResultBlock)resultBlock {
  67. [self showDatePickerWithMode:mode title:title selectValue:selectValue minDate:nil maxDate:nil isAutoSelect:isAutoSelect resultBlock:resultBlock];
  68. }
  69. #pragma mark - 3.显示日期选择器
  70. + (void)showDatePickerWithMode:(BRDatePickerMode)mode
  71. title:(NSString *)title
  72. selectValue:(NSString *)selectValue
  73. minDate:(NSDate *)minDate
  74. maxDate:(NSDate *)maxDate
  75. isAutoSelect:(BOOL)isAutoSelect
  76. resultBlock:(BRDateResultBlock)resultBlock {
  77. // 创建日期选择器
  78. BRDatePickerView *datePickerView = [[BRDatePickerView alloc]init];
  79. datePickerView.pickerMode = mode;
  80. datePickerView.title = title;
  81. datePickerView.selectValue = selectValue;
  82. datePickerView.minDate = minDate;
  83. datePickerView.maxDate = maxDate;
  84. datePickerView.isAutoSelect = isAutoSelect;
  85. datePickerView.resultBlock = resultBlock;
  86. // 显示
  87. [datePickerView show];
  88. }
  89. #pragma mark - 初始化日期选择器
  90. - (instancetype)initWithPickerMode:(BRDatePickerMode)pickerMode {
  91. if (self = [super init]) {
  92. self.pickerMode = pickerMode;
  93. }
  94. return self;
  95. }
  96. #pragma mark - 处理选择器数据
  97. - (void)handlerPickerData {
  98. // 1.最小日期限制
  99. self.minDate = [self handlerMinDate:self.minDate];
  100. // 2.最大日期限制
  101. self.maxDate = [self handlerMaxDate:self.maxDate];
  102. BOOL minMoreThanMax = [self br_compareDate:self.minDate targetDate:self.maxDate dateFormat:self.dateFormatter] == NSOrderedDescending;
  103. NSAssert(!minMoreThanMax, @"最小日期不能大于最大日期!");
  104. if (minMoreThanMax) {
  105. // 如果最小日期大于了最大日期,就忽略两个值
  106. self.minDate = [NSDate distantPast]; // 0000-12-30 00:00:00 +0000
  107. self.maxDate = [NSDate distantFuture]; // 4001-01-01 00:00:00 +0000
  108. }
  109. // 3.默认选中的日期
  110. self.mSelectDate = [self handlerSelectDate:self.selectDate dateFormat:self.dateFormatter];
  111. // 4.设置选择器日期数据
  112. if (self.style == BRDatePickerStyleCustom) {
  113. [self setupDateArray];
  114. }
  115. if (self.selectValue && ([self.selectValue isEqualToString:self.lastRowContent] || [self.selectValue isEqualToString:self.firstRowContent])) {
  116. self.mSelectDate = self.addToNow ? [NSDate date] : nil;
  117. } else {
  118. if (self.pickerMode == BRDatePickerModeYMDH && self.isShowAMAndPM) {
  119. self.hourIndex = (self.mSelectDate.br_hour < 12 ? 0 : 1);
  120. self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d-%02d %@", (int)self.mSelectDate.br_year, (int)self.mSelectDate.br_month, (int)self.mSelectDate.br_day, [self getHourString]];
  121. } else {
  122. self.mSelectValue = [self br_stringFromDate:self.mSelectDate dateFormat:self.dateFormatter];
  123. }
  124. }
  125. }
  126. #pragma mark - 设置默认日期数据源
  127. - (void)setupDateArray {
  128. if (self.selectValue && ([self.selectValue isEqualToString:self.lastRowContent] || [self.selectValue isEqualToString:self.firstRowContent])) {
  129. switch (self.pickerMode) {
  130. case BRDatePickerModeYMDHMS:
  131. case BRDatePickerModeYMDHM:
  132. case BRDatePickerModeYMDH:
  133. case BRDatePickerModeYMD:
  134. case BRDatePickerModeYM:
  135. case BRDatePickerModeY:
  136. {
  137. self.yearArr = [self getYearArr];
  138. self.monthArr = nil;
  139. self.dayArr = nil;
  140. self.hourArr = nil;
  141. self.minuteArr = nil;
  142. self.secondArr = nil;
  143. }
  144. break;
  145. case BRDatePickerModeMDHM:
  146. case BRDatePickerModeMD:
  147. {
  148. self.yearArr = [self getYearArr];
  149. self.monthArr = [self getMonthArr:self.mSelectDate.br_year];
  150. self.dayArr = nil;
  151. self.hourArr = nil;
  152. self.minuteArr = nil;
  153. self.secondArr = nil;
  154. }
  155. break;
  156. case BRDatePickerModeHMS:
  157. case BRDatePickerModeHM:
  158. {
  159. self.yearArr = [self getYearArr];
  160. self.monthArr = [self getMonthArr:self.mSelectDate.br_year];
  161. self.dayArr = [self getDayArr:self.mSelectDate.br_year month:self.mSelectDate.br_month];
  162. self.hourArr = [self getHourArr:self.mSelectDate.br_year month:self.mSelectDate.br_month day:self.mSelectDate.br_day];
  163. self.minuteArr = nil;
  164. self.secondArr = nil;
  165. }
  166. break;
  167. case BRDatePickerModeMS:
  168. {
  169. self.yearArr = [self getYearArr];
  170. self.monthArr = [self getMonthArr:self.mSelectDate.br_year];
  171. self.dayArr = [self getDayArr:self.mSelectDate.br_year month:self.mSelectDate.br_month];
  172. self.hourArr = [self getHourArr:self.mSelectDate.br_year month:self.mSelectDate.br_month day:self.mSelectDate.br_day];
  173. self.minuteArr = [self getMinuteArr:self.mSelectDate.br_year month:self.mSelectDate.br_month day:self.mSelectDate.br_day hour:self.mSelectDate.br_hour];
  174. self.secondArr = nil;
  175. }
  176. break;
  177. default:
  178. break;
  179. }
  180. } else {
  181. self.yearArr = [self getYearArr];
  182. self.monthArr = [self getMonthArr:self.mSelectDate.br_year];
  183. self.dayArr = [self getDayArr:self.mSelectDate.br_year month:self.mSelectDate.br_month];
  184. self.hourArr = [self getHourArr:self.mSelectDate.br_year month:self.mSelectDate.br_month day:self.mSelectDate.br_day];
  185. self.minuteArr = [self getMinuteArr:self.mSelectDate.br_year month:self.mSelectDate.br_month day:self.mSelectDate.br_day hour:self.mSelectDate.br_hour];
  186. 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];
  187. }
  188. }
  189. - (void)setupDateFormatter:(BRDatePickerMode)mode {
  190. switch (mode) {
  191. case BRDatePickerModeDate:
  192. {
  193. self.dateFormatter = @"yyyy-MM-dd";
  194. self.style = BRDatePickerStyleSystem;
  195. _datePickerMode = UIDatePickerModeDate;
  196. }
  197. break;
  198. case BRDatePickerModeDateAndTime:
  199. {
  200. self.dateFormatter = @"yyyy-MM-dd HH:mm";
  201. self.style = BRDatePickerStyleSystem;
  202. _datePickerMode = UIDatePickerModeDateAndTime;
  203. }
  204. break;
  205. case BRDatePickerModeTime:
  206. {
  207. self.dateFormatter = @"HH:mm";
  208. self.style = BRDatePickerStyleSystem;
  209. _datePickerMode = UIDatePickerModeTime;
  210. }
  211. break;
  212. case BRDatePickerModeCountDownTimer:
  213. {
  214. self.dateFormatter = @"HH:mm";
  215. self.style = BRDatePickerStyleSystem;
  216. _datePickerMode = UIDatePickerModeCountDownTimer;
  217. }
  218. break;
  219. case BRDatePickerModeYMDHMS:
  220. {
  221. self.dateFormatter = @"yyyy-MM-dd HH:mm:ss";
  222. self.style = BRDatePickerStyleCustom;
  223. self.unitArr = @[[self getYearUnit], [self getMonthUnit], [self getDayUnit], [self getHourUnit], [self getMinuteUnit], [self getSecondUnit]];
  224. }
  225. break;
  226. case BRDatePickerModeYMDHM:
  227. {
  228. self.dateFormatter = @"yyyy-MM-dd HH:mm";
  229. self.style = BRDatePickerStyleCustom;
  230. self.unitArr = @[[self getYearUnit], [self getMonthUnit], [self getDayUnit], [self getHourUnit], [self getMinuteUnit]];
  231. }
  232. break;
  233. case BRDatePickerModeYMDH:
  234. {
  235. self.dateFormatter = @"yyyy-MM-dd HH";
  236. self.style = BRDatePickerStyleCustom;
  237. self.unitArr = @[[self getYearUnit], [self getMonthUnit], [self getDayUnit], self.pickerMode == BRDatePickerModeYMDH && self.isShowAMAndPM ? @"" : [self getHourUnit]];
  238. }
  239. break;
  240. case BRDatePickerModeMDHM:
  241. {
  242. self.dateFormatter = @"MM-dd HH:mm";
  243. self.style = BRDatePickerStyleCustom;
  244. self.unitArr = @[[self getMonthUnit], [self getDayUnit], [self getHourUnit], [self getMinuteUnit]];
  245. }
  246. break;
  247. case BRDatePickerModeYMD:
  248. {
  249. self.dateFormatter = @"yyyy-MM-dd";
  250. self.style = BRDatePickerStyleCustom;
  251. self.unitArr = @[[self getYearUnit], [self getMonthUnit], [self getDayUnit]];
  252. }
  253. break;
  254. case BRDatePickerModeYM:
  255. {
  256. self.dateFormatter = @"yyyy-MM";
  257. self.style = BRDatePickerStyleCustom;
  258. self.unitArr = @[[self getYearUnit], [self getMonthUnit]];
  259. }
  260. break;
  261. case BRDatePickerModeY:
  262. {
  263. self.dateFormatter = @"yyyy";
  264. self.style = BRDatePickerStyleCustom;
  265. self.unitArr = @[[self getYearUnit]];
  266. }
  267. break;
  268. case BRDatePickerModeMD:
  269. {
  270. self.dateFormatter = @"MM-dd";
  271. self.style = BRDatePickerStyleCustom;
  272. self.unitArr = @[[self getMonthUnit], [self getDayUnit]];
  273. }
  274. break;
  275. case BRDatePickerModeHMS:
  276. {
  277. self.dateFormatter = @"HH:mm:ss";
  278. self.style = BRDatePickerStyleCustom;
  279. self.unitArr = @[[self getHourUnit], [self getMinuteUnit], [self getSecondUnit]];
  280. }
  281. break;
  282. case BRDatePickerModeHM:
  283. {
  284. self.dateFormatter = @"HH:mm";
  285. self.style = BRDatePickerStyleCustom;
  286. self.unitArr = @[[self getHourUnit], [self getMinuteUnit]];
  287. }
  288. break;
  289. case BRDatePickerModeMS:
  290. {
  291. self.dateFormatter = @"mm:ss";
  292. self.style = BRDatePickerStyleCustom;
  293. self.unitArr = @[[self getMinuteUnit], [self getSecondUnit]];
  294. }
  295. break;
  296. default:
  297. break;
  298. }
  299. }
  300. #pragma mark - 更新日期数据源数组
  301. - (void)reloadDateArrayWithUpdateMonth:(BOOL)updateMonth updateDay:(BOOL)updateDay updateHour:(BOOL)updateHour updateMinute:(BOOL)updateMinute updateSecond:(BOOL)updateSecond {
  302. _isAdjustSelectRow = NO;
  303. // 1.更新 monthArr
  304. if (self.yearArr.count == 0) {
  305. return;
  306. }
  307. NSString *yearString = [self getYearString];
  308. if ((self.lastRowContent && [yearString isEqualToString:self.lastRowContent]) || (self.firstRowContent && [yearString isEqualToString:self.firstRowContent])) {
  309. self.monthArr = nil;
  310. self.dayArr = nil;
  311. self.hourArr = nil;
  312. self.minuteArr = nil;
  313. self.secondArr = nil;
  314. return;
  315. }
  316. if (updateMonth) {
  317. NSString *lastSelectMonth = [self getMDHMSNumber:self.mSelectDate.br_month];
  318. self.monthArr = [self getMonthArr:[yearString integerValue]];
  319. if (self.mSelectDate) {
  320. if ([self.monthArr containsObject:lastSelectMonth]) {
  321. NSInteger monthIndex = [self.monthArr indexOfObject:lastSelectMonth];
  322. if (monthIndex != self.monthIndex) {
  323. _isAdjustSelectRow = YES;
  324. self.monthIndex = monthIndex;
  325. }
  326. } else {
  327. _isAdjustSelectRow = YES;
  328. self.monthIndex = ([lastSelectMonth intValue] < [self.monthArr.firstObject intValue]) ? 0 : (self.monthArr.count - 1);
  329. }
  330. }
  331. }
  332. // 2.更新 dayArr
  333. if (self.monthArr.count == 0) {
  334. return;
  335. }
  336. NSString *monthString = [self getMonthString];
  337. if ((self.lastRowContent && [monthString isEqualToString:self.lastRowContent]) || (self.firstRowContent && [monthString isEqualToString:self.firstRowContent])) {
  338. self.dayArr = nil;
  339. self.hourArr = nil;
  340. self.minuteArr = nil;
  341. self.secondArr = nil;
  342. return;
  343. }
  344. if (updateDay) {
  345. NSString *lastSelectDay = [self getMDHMSNumber:self.mSelectDate.br_day];
  346. self.dayArr = [self getDayArr:[yearString integerValue] month:[monthString integerValue]];
  347. if (self.mSelectDate) {
  348. if ([self.dayArr containsObject:lastSelectDay]) {
  349. NSInteger dayIndex = [self.dayArr indexOfObject:lastSelectDay];
  350. if (dayIndex != self.dayIndex) {
  351. _isAdjustSelectRow = YES;
  352. self.dayIndex = dayIndex;
  353. }
  354. } else {
  355. _isAdjustSelectRow = YES;
  356. self.dayIndex = ([lastSelectDay intValue] < [self.dayArr.firstObject intValue]) ? 0 : (self.dayArr.count - 1);
  357. }
  358. }
  359. }
  360. // 3.更新 hourArr
  361. if (self.dayArr.count == 0) {
  362. return;
  363. }
  364. NSInteger day = [[self getDayString] integerValue];
  365. if (updateHour) {
  366. NSString *lastSelectHour = [self getMDHMSNumber:self.mSelectDate.br_hour];
  367. self.hourArr = [self getHourArr:[yearString integerValue] month:[monthString integerValue] day:day];
  368. if (self.mSelectDate) {
  369. if ([self.hourArr containsObject:lastSelectHour]) {
  370. NSInteger hourIndex = [self.hourArr indexOfObject:lastSelectHour];
  371. if (hourIndex != self.hourIndex) {
  372. _isAdjustSelectRow = YES;
  373. self.hourIndex = hourIndex;
  374. }
  375. } else {
  376. _isAdjustSelectRow = YES;
  377. self.hourIndex = ([lastSelectHour intValue] < [self.hourArr.firstObject intValue]) ? 0 : (self.hourArr.count - 1);
  378. }
  379. }
  380. }
  381. // 4.更新 minuteArr
  382. if (self.hourArr.count == 0) {
  383. return;
  384. }
  385. NSString *hourString = [self getHourString];
  386. if ((self.lastRowContent && [hourString isEqualToString:self.lastRowContent]) || (self.firstRowContent && [hourString isEqualToString:self.firstRowContent])) {
  387. self.minuteArr = nil;
  388. self.secondArr = nil;
  389. return;
  390. }
  391. if (updateMinute) {
  392. NSString *lastSelectMinute = [self getMDHMSNumber:self.mSelectDate.br_minute];
  393. self.minuteArr = [self getMinuteArr:[yearString integerValue] month:[monthString integerValue] day:day hour:[hourString integerValue]];
  394. if (self.mSelectDate) {
  395. if ([self.minuteArr containsObject:lastSelectMinute]) {
  396. NSInteger minuteIndex = [self.minuteArr indexOfObject:lastSelectMinute];
  397. if (minuteIndex != self.minuteIndex) {
  398. _isAdjustSelectRow = YES;
  399. self.minuteIndex = minuteIndex;
  400. }
  401. } else {
  402. _isAdjustSelectRow = YES;
  403. self.minuteIndex = ([lastSelectMinute intValue] < [self.minuteArr.firstObject intValue]) ? 0 : (self.minuteArr.count - 1);
  404. }
  405. }
  406. }
  407. // 5.更新 secondArr
  408. if (self.minuteArr.count == 0) {
  409. return;
  410. }
  411. NSString *minuteString = [self getMinuteString];
  412. if ((self.lastRowContent && [minuteString isEqualToString:self.lastRowContent]) || (self.firstRowContent && [minuteString isEqualToString:self.firstRowContent])) {
  413. self.secondArr = nil;
  414. return;
  415. }
  416. if (updateSecond) {
  417. NSString *lastSelectSecond = [self getMDHMSNumber:self.mSelectDate.br_second];
  418. self.secondArr = [self getSecondArr:[yearString integerValue] month:[monthString integerValue] day:day hour:[hourString integerValue] minute:[minuteString integerValue]];
  419. if (self.mSelectDate) {
  420. if ([self.secondArr containsObject:lastSelectSecond]) {
  421. NSInteger secondIndex = [self.secondArr indexOfObject:lastSelectSecond];
  422. if (secondIndex != self.secondIndex) {
  423. _isAdjustSelectRow = YES;
  424. self.secondIndex = secondIndex;
  425. }
  426. } else {
  427. _isAdjustSelectRow = YES;
  428. self.secondIndex = ([lastSelectSecond intValue] < [self.secondArr.firstObject intValue]) ? 0 : (self.secondArr.count - 1);
  429. }
  430. }
  431. }
  432. }
  433. #pragma mark - 滚动到指定日期的位置(更新选择的索引)
  434. - (void)scrollToSelectDate:(NSDate *)selectDate animated:(BOOL)animated {
  435. self.yearIndex = [self getIndexWithArray:self.yearArr object:[self getYearNumber:selectDate.br_year]];
  436. self.monthIndex = [self getIndexWithArray:self.monthArr object:[self getMDHMSNumber:selectDate.br_month]];
  437. self.dayIndex = [self getIndexWithArray:self.dayArr object:[self getMDHMSNumber:selectDate.br_day]];
  438. if (self.pickerMode == BRDatePickerModeYMDH && self.isShowAMAndPM) {
  439. self.hourIndex = selectDate.br_hour < 12 ? 0 : 1;
  440. } else {
  441. self.hourIndex = [self getIndexWithArray:self.hourArr object:[self getMDHMSNumber:selectDate.br_hour]];
  442. }
  443. self.minuteIndex = [self getIndexWithArray:self.minuteArr object:[self getMDHMSNumber:selectDate.br_minute]];
  444. self.secondIndex = [self getIndexWithArray:self.secondArr object:[self getMDHMSNumber:selectDate.br_second]];
  445. NSArray *indexArr = nil;
  446. if (self.pickerMode == BRDatePickerModeYMDHMS) {
  447. indexArr = @[@(self.yearIndex), @(self.monthIndex), @(self.dayIndex), @(self.hourIndex), @(self.minuteIndex), @(self.secondIndex)];
  448. } else if (self.pickerMode == BRDatePickerModeYMDHM) {
  449. indexArr = @[@(self.yearIndex), @(self.monthIndex), @(self.dayIndex), @(self.hourIndex), @(self.minuteIndex)];
  450. } else if (self.pickerMode == BRDatePickerModeYMDH) {
  451. indexArr = @[@(self.yearIndex), @(self.monthIndex), @(self.dayIndex), @(self.hourIndex)];
  452. } else if (self.pickerMode == BRDatePickerModeMDHM) {
  453. indexArr = @[@(self.monthIndex), @(self.dayIndex), @(self.hourIndex), @(self.minuteIndex)];
  454. } else if (self.pickerMode == BRDatePickerModeYMD) {
  455. if ([self.pickerStyle.language hasPrefix:@"zh"]) {
  456. indexArr = @[@(self.yearIndex), @(self.monthIndex), @(self.dayIndex)];
  457. } else {
  458. indexArr = @[@(self.dayIndex), @(self.monthIndex), @(self.yearIndex)];
  459. }
  460. } else if (self.pickerMode == BRDatePickerModeYM) {
  461. if ([self.pickerStyle.language hasPrefix:@"zh"]) {
  462. indexArr = @[@(self.yearIndex), @(self.monthIndex)];
  463. } else {
  464. indexArr = @[@(self.monthIndex), @(self.yearIndex)];
  465. }
  466. } else if (self.pickerMode == BRDatePickerModeY) {
  467. indexArr = @[@(self.yearIndex)];
  468. } else if (self.pickerMode == BRDatePickerModeMD) {
  469. indexArr = @[@(self.monthIndex), @(self.dayIndex)];
  470. } else if (self.pickerMode == BRDatePickerModeHMS) {
  471. indexArr = @[@(self.hourIndex), @(self.minuteIndex), @(self.secondIndex)];
  472. } else if (self.pickerMode == BRDatePickerModeHM) {
  473. indexArr = @[@(self.hourIndex), @(self.minuteIndex)];
  474. } else if (self.pickerMode == BRDatePickerModeMS) {
  475. indexArr = @[@(self.minuteIndex), @(self.secondIndex)];
  476. }
  477. if (!indexArr) return;
  478. for (NSInteger i = 0; i < indexArr.count; i++) {
  479. [self.pickerView selectRow:[indexArr[i] integerValue] inComponent:i animated:animated];
  480. }
  481. }
  482. #pragma mark - 滚动到【自定义字符串】的位置
  483. - (void)scrollToCustomString:(BOOL)animated {
  484. switch (self.pickerMode) {
  485. case BRDatePickerModeYMDHMS:
  486. case BRDatePickerModeYMDHM:
  487. case BRDatePickerModeYMDH:
  488. case BRDatePickerModeYMD:
  489. case BRDatePickerModeYM:
  490. case BRDatePickerModeY:
  491. {
  492. NSInteger yearIndex = ([self.selectValue isEqualToString:self.lastRowContent] && self.yearArr.count > 0) ? self.yearArr.count - 1 : 0;
  493. NSInteger component = 0;
  494. if (self.pickerMode == BRDatePickerModeYMD && ![self.pickerStyle.language hasPrefix:@"zh"]) {
  495. component = 2;
  496. } else if (self.pickerMode == BRDatePickerModeYM && ![self.pickerStyle.language hasPrefix:@"zh"]) {
  497. component = 1;
  498. }
  499. [self.pickerView selectRow:yearIndex inComponent:component animated:animated];
  500. }
  501. break;
  502. case BRDatePickerModeMDHM:
  503. case BRDatePickerModeMD:
  504. {
  505. NSInteger monthIndex = ([self.selectValue isEqualToString:self.lastRowContent] && self.monthArr.count > 0) ? self.monthArr.count - 1 : 0;
  506. [self.pickerView selectRow:monthIndex inComponent:0 animated:animated];
  507. }
  508. break;
  509. case BRDatePickerModeHMS:
  510. case BRDatePickerModeHM:
  511. {
  512. NSInteger hourIndex = ([self.selectValue isEqualToString:self.lastRowContent] && self.hourArr.count > 0) ? self.hourArr.count - 1 : 0;
  513. [self.pickerView selectRow:hourIndex inComponent:0 animated:animated];
  514. }
  515. break;
  516. case BRDatePickerModeMS:
  517. {
  518. NSInteger minuteIndex = ([self.selectValue isEqualToString:self.lastRowContent] && self.minuteArr.count > 0) ? self.minuteArr.count - 1 : 0;
  519. [self.pickerView selectRow:minuteIndex inComponent:0 animated:animated];
  520. }
  521. break;
  522. default:
  523. break;
  524. }
  525. }
  526. #pragma mark - 日期选择器1
  527. - (UIDatePicker *)datePicker {
  528. if (!_datePicker) {
  529. CGFloat pickerHeaderViewHeight = self.pickerHeaderView ? self.pickerHeaderView.bounds.size.height : 0;
  530. _datePicker = [[UIDatePicker alloc]initWithFrame:CGRectMake(0, self.pickerStyle.titleBarHeight + pickerHeaderViewHeight, self.keyView.bounds.size.width, self.pickerStyle.pickerHeight)];
  531. _datePicker.backgroundColor = self.pickerStyle.pickerColor;
  532. _datePicker.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth;
  533. // 滚动改变值的响应事件
  534. [_datePicker addTarget:self action:@selector(didSelectValueChanged:) forControlEvents:UIControlEventValueChanged];
  535. }
  536. return _datePicker;
  537. }
  538. #pragma mark - 日期选择器2
  539. - (UIPickerView *)pickerView {
  540. if (!_pickerView) {
  541. CGFloat pickerHeaderViewHeight = self.pickerHeaderView ? self.pickerHeaderView.bounds.size.height : 0;
  542. _pickerView = [[UIPickerView alloc]initWithFrame:CGRectMake(0, self.pickerStyle.titleBarHeight + pickerHeaderViewHeight, self.keyView.bounds.size.width, self.pickerStyle.pickerHeight)];
  543. _pickerView.backgroundColor = self.pickerStyle.pickerColor;
  544. _pickerView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth;
  545. _pickerView.dataSource = self;
  546. _pickerView.delegate = self;
  547. }
  548. return _pickerView;
  549. }
  550. #pragma mark - UIPickerViewDataSource
  551. // 1.设置 pickerView 的列数
  552. - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
  553. if (self.pickerMode == BRDatePickerModeYMDHMS) {
  554. return 6;
  555. } else if (self.pickerMode == BRDatePickerModeYMDHM) {
  556. return 5;
  557. } else if (self.pickerMode == BRDatePickerModeYMDH) {
  558. return 4;
  559. } else if (self.pickerMode == BRDatePickerModeMDHM) {
  560. return 4;
  561. } else if (self.pickerMode == BRDatePickerModeYMD) {
  562. return 3;
  563. } else if (self.pickerMode == BRDatePickerModeYM) {
  564. return 2;
  565. } else if (self.pickerMode == BRDatePickerModeY) {
  566. return 1;
  567. } else if (self.pickerMode == BRDatePickerModeMD) {
  568. return 2;
  569. } else if (self.pickerMode == BRDatePickerModeHMS) {
  570. return 3;
  571. } else if (self.pickerMode == BRDatePickerModeHM) {
  572. return 2;
  573. } else if (self.pickerMode == BRDatePickerModeMS) {
  574. return 2;
  575. }
  576. return 0;
  577. }
  578. // 2.设置 pickerView 每列的行数
  579. - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
  580. NSArray *rowsArr = [NSArray array];
  581. if (self.pickerMode == BRDatePickerModeYMDHMS) {
  582. rowsArr = @[@(self.yearArr.count), @(self.monthArr.count), @(self.dayArr.count), @(self.hourArr.count), @(self.minuteArr.count), @(self.secondArr.count)];
  583. } else if (self.pickerMode == BRDatePickerModeYMDHM) {
  584. rowsArr = @[@(self.yearArr.count), @(self.monthArr.count), @(self.dayArr.count), @(self.hourArr.count), @(self.minuteArr.count)];
  585. } else if (self.pickerMode == BRDatePickerModeYMDH) {
  586. rowsArr = @[@(self.yearArr.count), @(self.monthArr.count), @(self.dayArr.count), @(self.hourArr.count)];
  587. } else if (self.pickerMode == BRDatePickerModeMDHM) {
  588. rowsArr = @[@(self.monthArr.count), @(self.dayArr.count), @(self.hourArr.count), @(self.minuteArr.count)];
  589. } else if (self.pickerMode == BRDatePickerModeYMD) {
  590. if ([self.pickerStyle.language hasPrefix:@"zh"]) {
  591. rowsArr = @[@(self.yearArr.count), @(self.monthArr.count), @(self.dayArr.count)];
  592. } else {
  593. rowsArr = @[@(self.dayArr.count), @(self.monthArr.count), @(self.yearArr.count)];
  594. }
  595. } else if (self.pickerMode == BRDatePickerModeYM) {
  596. if ([self.pickerStyle.language hasPrefix:@"zh"]) {
  597. rowsArr = @[@(self.yearArr.count), @(self.monthArr.count)];
  598. } else {
  599. rowsArr = @[@(self.monthArr.count), @(self.yearArr.count)];
  600. }
  601. } else if (self.pickerMode == BRDatePickerModeY) {
  602. rowsArr = @[@(self.yearArr.count)];
  603. } else if (self.pickerMode == BRDatePickerModeMD) {
  604. rowsArr = @[@(self.monthArr.count), @(self.dayArr.count)];
  605. } else if (self.pickerMode == BRDatePickerModeHMS) {
  606. rowsArr = @[@(self.hourArr.count), @(self.minuteArr.count), @(self.secondArr.count)];
  607. } else if (self.pickerMode == BRDatePickerModeHM) {
  608. rowsArr = @[@(self.hourArr.count), @(self.minuteArr.count)];
  609. } else if (self.pickerMode == BRDatePickerModeMS) {
  610. rowsArr = @[@(self.minuteArr.count), @(self.secondArr.count)];
  611. }
  612. if (component >= 0 && component < rowsArr.count) {
  613. return [rowsArr[component] integerValue];
  614. }
  615. return 0;
  616. }
  617. #pragma mark - UIPickerViewDelegate
  618. // 3. 设置 pickerView 的显示内容
  619. - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view {
  620. // 1.自定义 row 的内容视图
  621. UILabel *label = (UILabel *)view;
  622. if (!label) {
  623. label = [[UILabel alloc]init];
  624. label.backgroundColor = [UIColor clearColor];
  625. label.textAlignment = NSTextAlignmentCenter;
  626. label.font = self.pickerStyle.pickerTextFont;
  627. label.textColor = self.pickerStyle.pickerTextColor;
  628. // 字体自适应属性
  629. label.adjustsFontSizeToFitWidth = YES;
  630. // 自适应最小字体缩放比例
  631. label.minimumScaleFactor = 0.5f;
  632. }
  633. label.text = [self pickerView:pickerView titleForRow:row forComponent:component];
  634. // 2.设置选择器中间选中行的样式
  635. [self.pickerStyle setupPickerSelectRowStyle:pickerView titleForRow:row forComponent:component];
  636. return label;
  637. }
  638. - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
  639. NSString *titleString = @"";
  640. if (self.pickerMode == BRDatePickerModeYMDHMS) {
  641. if (component == 0) {
  642. titleString = [self getYearText:self.yearArr row:row];
  643. } else if (component == 1) {
  644. titleString = [self getMonthText:self.monthArr row:row];
  645. } else if (component == 2) {
  646. titleString = [self getDayText:self.dayArr row:row mSelectDate:self.mSelectDate];
  647. } else if (component == 3) {
  648. titleString = [self getHourText:self.hourArr row:row];
  649. } else if (component == 4) {
  650. titleString = [self getMinuteText:self.minuteArr row:row];
  651. } else if (component == 5) {
  652. titleString = [self getSecondText:self.secondArr row:row];
  653. }
  654. } else if (self.pickerMode == BRDatePickerModeYMDHM) {
  655. if (component == 0) {
  656. titleString = [self getYearText:self.yearArr row:row];
  657. } else if (component == 1) {
  658. titleString = [self getMonthText:self.monthArr row:row];
  659. } else if (component == 2) {
  660. titleString = [self getDayText:self.dayArr row:row mSelectDate:self.mSelectDate];
  661. } else if (component == 3) {
  662. titleString = [self getHourText:self.hourArr row:row];
  663. } else if (component == 4) {
  664. titleString = [self getMinuteText:self.minuteArr row:row];
  665. }
  666. } else if (self.pickerMode == BRDatePickerModeYMDH) {
  667. if (component == 0) {
  668. titleString = [self getYearText:self.yearArr row:row];;
  669. } else if (component == 1) {
  670. titleString = [self getMonthText:self.monthArr row:row];
  671. } else if (component == 2) {
  672. titleString = [self getDayText:self.dayArr row:row mSelectDate:self.mSelectDate];
  673. } else if (component == 3) {
  674. titleString = [self getHourText:self.hourArr row:row];
  675. }
  676. } else if (self.pickerMode == BRDatePickerModeMDHM) {
  677. if (component == 0) {
  678. titleString = [self getMonthText:self.monthArr row:row];
  679. } else if (component == 1) {
  680. titleString = [self getDayText:self.dayArr row:row mSelectDate:self.mSelectDate];
  681. } else if (component == 2) {
  682. titleString = [self getHourText:self.hourArr row:row];
  683. } else if (component == 3) {
  684. titleString = [self getMinuteText:self.minuteArr row:row];
  685. }
  686. } else if (self.pickerMode == BRDatePickerModeYMD) {
  687. if (component == 0) {
  688. titleString = [self.pickerStyle.language hasPrefix:@"zh"] ? [self getYearText:self.yearArr row:row] : [self getDayText:self.dayArr row:row mSelectDate:self.mSelectDate];
  689. } else if (component == 1) {
  690. titleString = [self getMonthText:self.monthArr row:row];
  691. } else if (component == 2) {
  692. titleString = [self.pickerStyle.language hasPrefix:@"zh"] ? [self getDayText:self.dayArr row:row mSelectDate:self.mSelectDate] : [self getYearText:self.yearArr row:row];
  693. }
  694. } else if (self.pickerMode == BRDatePickerModeYM) {
  695. if (component == 0) {
  696. titleString = [self.pickerStyle.language hasPrefix:@"zh"] ? [self getYearText:self.yearArr row:row] : [self getMonthText:self.monthArr row:row];
  697. } else if (component == 1) {
  698. titleString = [self.pickerStyle.language hasPrefix:@"zh"] ? [self getMonthText:self.monthArr row:row] : [self getYearText:self.yearArr row:row];
  699. }
  700. } else if (self.pickerMode == BRDatePickerModeY) {
  701. if (component == 0) {
  702. titleString = [self getYearText:self.yearArr row:row];
  703. }
  704. } else if (self.pickerMode == BRDatePickerModeMD) {
  705. if (component == 0) {
  706. titleString = [self getMonthText:self.monthArr row:row];
  707. } else if (component == 1) {
  708. titleString = [self getDayText:self.dayArr row:row mSelectDate:self.mSelectDate];
  709. }
  710. } else if (self.pickerMode == BRDatePickerModeHMS) {
  711. if (component == 0) {
  712. titleString = [self getHourText:self.hourArr row:row];
  713. } else if (component == 1) {
  714. titleString = [self getMinuteText:self.minuteArr row:row];
  715. } else if (component == 2) {
  716. titleString = [self getSecondText:self.secondArr row:row];
  717. }
  718. } else if (self.pickerMode == BRDatePickerModeHM) {
  719. if (component == 0) {
  720. titleString = [self getHourText:self.hourArr row:row];
  721. } else if (component == 1) {
  722. titleString = [self getMinuteText:self.minuteArr row:row];
  723. }
  724. } else if (self.pickerMode == BRDatePickerModeMS) {
  725. if (component == 0) {
  726. titleString = [self getMinuteText:self.minuteArr row:row];
  727. } else if (component == 1) {
  728. titleString = [self getSecondText:self.secondArr row:row];
  729. }
  730. }
  731. return titleString;
  732. }
  733. // 4.滚动 pickerView 执行的回调方法
  734. - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
  735. NSString *lastSelectValue = self.mSelectValue;
  736. NSDate *lastSelectDate = self.mSelectDate;
  737. if (self.pickerMode == BRDatePickerModeYMDHMS) {
  738. if (component == 0) {
  739. self.yearIndex = row;
  740. [self reloadDateArrayWithUpdateMonth:YES updateDay:YES updateHour:YES updateMinute:YES updateSecond:YES];
  741. [self.pickerView reloadComponent:1];
  742. [self.pickerView reloadComponent:2];
  743. [self.pickerView reloadComponent:3];
  744. [self.pickerView reloadComponent:4];
  745. [self.pickerView reloadComponent:5];
  746. } else if (component == 1) {
  747. self.monthIndex = row;
  748. [self reloadDateArrayWithUpdateMonth:NO updateDay:YES updateHour:YES updateMinute:YES updateSecond:YES];
  749. [self.pickerView reloadComponent:2];
  750. [self.pickerView reloadComponent:3];
  751. [self.pickerView reloadComponent:4];
  752. [self.pickerView reloadComponent:5];
  753. } else if (component == 2) {
  754. self.dayIndex = row;
  755. [self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:YES updateMinute:YES updateSecond:YES];
  756. [self.pickerView reloadComponent:3];
  757. [self.pickerView reloadComponent:4];
  758. [self.pickerView reloadComponent:5];
  759. } else if (component == 3) {
  760. self.hourIndex = row;
  761. [self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:YES updateSecond:YES];
  762. [self.pickerView reloadComponent:4];
  763. [self.pickerView reloadComponent:5];
  764. } else if (component == 4) {
  765. self.minuteIndex = row;
  766. [self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:NO updateSecond:YES];
  767. [self.pickerView reloadComponent:5];
  768. } else if (component == 5) {
  769. self.secondIndex = row;
  770. }
  771. NSString *yearString = [self getYearString];
  772. if (![yearString isEqualToString:self.lastRowContent] && ![yearString isEqualToString:self.firstRowContent]) {
  773. if (self.yearArr.count * self.monthArr.count * self.dayArr.count * self.hourArr.count * self.minuteArr.count * self.secondArr.count == 0) return;
  774. int year = [[self getYearString] intValue];
  775. int month = [[self getMonthString] intValue];
  776. int day = [[self getDayString] intValue];
  777. int hour = [[self getHourString] intValue];
  778. int minute = [[self getMinuteString] intValue];
  779. int second = [[self getSecondString] intValue];
  780. self.mSelectDate = [NSDate br_setYear:year month:month day:day hour:hour minute:minute second:second];
  781. self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, minute, second];
  782. } else {
  783. self.mSelectDate = self.addToNow ? [NSDate date] : nil;
  784. if ([yearString isEqualToString:self.lastRowContent]) {
  785. self.mSelectValue = self.lastRowContent;
  786. } else if ([yearString isEqualToString:self.firstRowContent]) {
  787. self.mSelectValue = self.firstRowContent;
  788. }
  789. }
  790. } else if (self.pickerMode == BRDatePickerModeYMDHM) {
  791. if (component == 0) {
  792. self.yearIndex = row;
  793. [self reloadDateArrayWithUpdateMonth:YES updateDay:YES updateHour:YES updateMinute:YES updateSecond:NO];
  794. [self.pickerView reloadComponent:1];
  795. [self.pickerView reloadComponent:2];
  796. [self.pickerView reloadComponent:3];
  797. [self.pickerView reloadComponent:4];
  798. } else if (component == 1) {
  799. self.monthIndex = row;
  800. [self reloadDateArrayWithUpdateMonth:NO updateDay:YES updateHour:YES updateMinute:YES updateSecond:NO];
  801. [self.pickerView reloadComponent:2];
  802. [self.pickerView reloadComponent:3];
  803. [self.pickerView reloadComponent:4];
  804. } else if (component == 2) {
  805. self.dayIndex = row;
  806. [self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:YES updateMinute:YES updateSecond:NO];
  807. [self.pickerView reloadComponent:3];
  808. [self.pickerView reloadComponent:4];
  809. } else if (component == 3) {
  810. self.hourIndex = row;
  811. [self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:YES updateSecond:NO];
  812. [self.pickerView reloadComponent:4];
  813. } else if (component == 4) {
  814. self.minuteIndex = row;
  815. }
  816. NSString *yearString = [self getYearString];
  817. if (![yearString isEqualToString:self.lastRowContent] && ![yearString isEqualToString:self.firstRowContent]) {
  818. if (self.yearArr.count * self.monthArr.count * self.dayArr.count * self.hourArr.count * self.minuteArr.count == 0) return;
  819. int year = [[self getYearString] intValue];
  820. int month = [[self getMonthString] intValue];
  821. int day = [[self getDayString] intValue];
  822. int hour = [[self getHourString] intValue];
  823. int minute = [[self getMinuteString] intValue];
  824. self.mSelectDate = [NSDate br_setYear:year month:month day:day hour:hour minute:minute];
  825. self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d-%02d %02d:%02d", year, month, day, hour, minute];
  826. } else {
  827. self.mSelectDate = self.addToNow ? [NSDate date] : nil;
  828. if ([yearString isEqualToString:self.lastRowContent]) {
  829. self.mSelectValue = self.lastRowContent;
  830. } else if ([yearString isEqualToString:self.firstRowContent]) {
  831. self.mSelectValue = self.firstRowContent;
  832. }
  833. }
  834. } else if (self.pickerMode == BRDatePickerModeYMDH) {
  835. if (component == 0) {
  836. self.yearIndex = row;
  837. [self reloadDateArrayWithUpdateMonth:YES updateDay:YES updateHour:YES updateMinute:NO updateSecond:NO];
  838. [self.pickerView reloadComponent:1];
  839. [self.pickerView reloadComponent:2];
  840. [self.pickerView reloadComponent:3];
  841. } else if (component == 1) {
  842. self.monthIndex = row;
  843. [self reloadDateArrayWithUpdateMonth:NO updateDay:YES updateHour:YES updateMinute:NO updateSecond:NO];
  844. [self.pickerView reloadComponent:2];
  845. [self.pickerView reloadComponent:3];
  846. } else if (component == 2) {
  847. self.dayIndex = row;
  848. [self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:YES updateMinute:NO updateSecond:NO];
  849. [self.pickerView reloadComponent:3];
  850. } else if (component == 3) {
  851. self.hourIndex = row;
  852. }
  853. NSString *yearString = [self getYearString];
  854. if (![yearString isEqualToString:self.lastRowContent] && ![yearString isEqualToString:self.firstRowContent]) {
  855. if (self.yearArr.count * self.monthArr.count * self.dayArr.count * self.hourArr.count == 0) return;
  856. int year = [[self getYearString] intValue];
  857. int month = [[self getMonthString] intValue];
  858. int day = [[self getDayString] intValue];
  859. int hour = 0;
  860. if (self.pickerMode == BRDatePickerModeYMDH && self.isShowAMAndPM) {
  861. hour = (self.hourIndex == 0 ? 0 : 12);
  862. self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d-%02d %@", year, month, day, [self getHourString]];
  863. } else {
  864. hour = [[self getHourString] intValue];
  865. self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d-%02d %02d", year, month, day, hour];
  866. }
  867. self.mSelectDate = [NSDate br_setYear:year month:month day:day hour:hour];
  868. } else {
  869. self.mSelectDate = self.addToNow ? [NSDate date] : nil;
  870. if ([yearString isEqualToString:self.lastRowContent]) {
  871. self.mSelectValue = self.lastRowContent;
  872. } else if ([yearString isEqualToString:self.firstRowContent]) {
  873. self.mSelectValue = self.firstRowContent;
  874. }
  875. }
  876. } else if (self.pickerMode == BRDatePickerModeMDHM) {
  877. if (component == 0) {
  878. self.monthIndex = row;
  879. [self reloadDateArrayWithUpdateMonth:NO updateDay:YES updateHour:YES updateMinute:YES updateSecond:NO];
  880. [self.pickerView reloadComponent:1];
  881. [self.pickerView reloadComponent:2];
  882. [self.pickerView reloadComponent:3];
  883. } else if (component == 1) {
  884. self.dayIndex = row;
  885. [self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:YES updateMinute:YES updateSecond:NO];
  886. [self.pickerView reloadComponent:2];
  887. [self.pickerView reloadComponent:3];
  888. } else if (component == 2) {
  889. self.hourIndex = row;
  890. [self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:YES updateSecond:NO];
  891. [self.pickerView reloadComponent:3];
  892. } else if (component == 3) {
  893. self.minuteIndex = row;
  894. }
  895. NSString *monthString = [self getMonthString];
  896. if (![monthString isEqualToString:self.lastRowContent] && ![monthString isEqualToString:self.firstRowContent]) {
  897. if (self.yearArr.count * self.monthArr.count * self.dayArr.count * self.hourArr.count * self.minuteArr.count == 0) return;
  898. int year = [[self getYearString] intValue];
  899. int month = [[self getMonthString] intValue];
  900. int day = [[self getDayString] intValue];
  901. int hour = [[self getHourString] intValue];
  902. int minute = [[self getMinuteString] intValue];
  903. self.mSelectDate = [NSDate br_setYear:year month:month day:day hour:hour minute:minute];
  904. self.mSelectValue = [NSString stringWithFormat:@"%02d-%02d %02d:%02d", month, day, hour, minute];
  905. } else {
  906. self.mSelectDate = self.addToNow ? [NSDate date] : nil;
  907. if ([monthString isEqualToString:self.lastRowContent]) {
  908. self.mSelectValue = self.lastRowContent;
  909. } else if ([monthString isEqualToString:self.firstRowContent]) {
  910. self.mSelectValue = self.firstRowContent;
  911. }
  912. }
  913. } else if (self.pickerMode == BRDatePickerModeYMD) {
  914. if (component == 0) {
  915. if ([self.pickerStyle.language hasPrefix:@"zh"]) {
  916. self.yearIndex = row;
  917. [self reloadDateArrayWithUpdateMonth:YES updateDay:YES updateHour:NO updateMinute:NO updateSecond:NO];
  918. [self.pickerView reloadComponent:1];
  919. [self.pickerView reloadComponent:2];
  920. } else {
  921. self.dayIndex = row;
  922. }
  923. } else if (component == 1) {
  924. self.monthIndex = row;
  925. [self reloadDateArrayWithUpdateMonth:NO updateDay:YES updateHour:NO updateMinute:NO updateSecond:NO];
  926. if ([self.pickerStyle.language hasPrefix:@"zh"]) {
  927. [self.pickerView reloadComponent:2];
  928. } else {
  929. [self.pickerView reloadComponent:0];
  930. }
  931. } else if (component == 2) {
  932. if ([self.pickerStyle.language hasPrefix:@"zh"]) {
  933. self.dayIndex = row;
  934. } else {
  935. self.yearIndex = row;
  936. [self reloadDateArrayWithUpdateMonth:YES updateDay:YES updateHour:NO updateMinute:NO updateSecond:NO];
  937. [self.pickerView reloadComponent:0];
  938. [self.pickerView reloadComponent:1];
  939. }
  940. }
  941. NSString *yearString = [self getYearString];
  942. if (![yearString isEqualToString:self.lastRowContent] && ![yearString isEqualToString:self.firstRowContent]) {
  943. if (self.yearArr.count * self.monthArr.count * self.dayArr.count == 0) return;
  944. int year = [[self getYearString] intValue];
  945. int month = [[self getMonthString] intValue];
  946. int day = [[self getDayString] intValue];
  947. self.mSelectDate = [NSDate br_setYear:year month:month day:day];
  948. self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d-%02d", year, month, day];
  949. } else {
  950. self.mSelectDate = self.addToNow ? [NSDate date] : nil;
  951. if ([yearString isEqualToString:self.lastRowContent]) {
  952. self.mSelectValue = self.lastRowContent;
  953. } else if ([yearString isEqualToString:self.firstRowContent]) {
  954. self.mSelectValue = self.firstRowContent;
  955. }
  956. }
  957. } else if (self.pickerMode == BRDatePickerModeYM) {
  958. if (component == 0) {
  959. if ([self.pickerStyle.language hasPrefix:@"zh"]) {
  960. self.yearIndex = row;
  961. [self reloadDateArrayWithUpdateMonth:YES updateDay:NO updateHour:NO updateMinute:NO updateSecond:NO];
  962. [self.pickerView reloadComponent:1];
  963. } else {
  964. self.monthIndex = row;
  965. }
  966. } else if (component == 1) {
  967. if ([self.pickerStyle.language hasPrefix:@"zh"]) {
  968. self.monthIndex = row;
  969. } else {
  970. self.yearIndex = row;
  971. [self reloadDateArrayWithUpdateMonth:YES updateDay:NO updateHour:NO updateMinute:NO updateSecond:NO];
  972. [self.pickerView reloadComponent:0];
  973. }
  974. }
  975. NSString *yearString = [self getYearString];
  976. if (![yearString isEqualToString:self.lastRowContent] && ![yearString isEqualToString:self.firstRowContent]) {
  977. if (self.yearArr.count * self.monthArr.count == 0) return;
  978. int year = [[self getYearString] intValue];
  979. int month = [[self getMonthString] intValue];
  980. self.mSelectDate = [NSDate br_setYear:year month:month];
  981. self.mSelectValue = [NSString stringWithFormat:@"%04d-%02d", year, month];
  982. } else {
  983. self.mSelectDate = self.addToNow ? [NSDate date] : nil;
  984. if ([yearString isEqualToString:self.lastRowContent]) {
  985. self.mSelectValue = self.lastRowContent;
  986. } else if ([yearString isEqualToString:self.firstRowContent]) {
  987. self.mSelectValue = self.firstRowContent;
  988. }
  989. }
  990. } else if (self.pickerMode == BRDatePickerModeY) {
  991. if (component == 0) {
  992. self.yearIndex = row;
  993. }
  994. NSString *yearString = [self getYearString];
  995. if (![yearString isEqualToString:self.lastRowContent] && ![yearString isEqualToString:self.firstRowContent]) {
  996. if (self.yearArr.count == 0) return;
  997. int year = [[self getYearString] intValue];
  998. self.mSelectDate = [NSDate br_setYear:year];
  999. self.mSelectValue = [NSString stringWithFormat:@"%04d", year];
  1000. } else {
  1001. self.mSelectDate = self.addToNow ? [NSDate date] : nil;
  1002. if ([yearString isEqualToString:self.lastRowContent]) {
  1003. self.mSelectValue = self.lastRowContent;
  1004. } else if ([yearString isEqualToString:self.firstRowContent]) {
  1005. self.mSelectValue = self.firstRowContent;
  1006. }
  1007. }
  1008. } else if (self.pickerMode == BRDatePickerModeMD) {
  1009. if (component == 0) {
  1010. self.monthIndex = row;
  1011. [self reloadDateArrayWithUpdateMonth:NO updateDay:YES updateHour:NO updateMinute:NO updateSecond:NO];
  1012. [self.pickerView reloadComponent:1];
  1013. } else if (component == 1) {
  1014. self.dayIndex = row;
  1015. }
  1016. NSString *monthString = [self getMonthString];
  1017. if (![monthString isEqualToString:self.lastRowContent] && ![monthString isEqualToString:self.firstRowContent]) {
  1018. if (self.yearArr.count * self.monthArr.count * self.dayArr.count == 0) return;
  1019. int year = [[self getYearString] intValue];
  1020. int month = [[self getMonthString] intValue];
  1021. int day = [[self getDayString] intValue];
  1022. self.mSelectDate = [NSDate br_setYear:year month:month day:day];
  1023. self.mSelectValue = [NSString stringWithFormat:@"%02d-%02d", month, day];
  1024. } else {
  1025. self.mSelectDate = self.addToNow ? [NSDate date] : nil;
  1026. if ([monthString isEqualToString:self.lastRowContent]) {
  1027. self.mSelectValue = self.lastRowContent;
  1028. } else if ([monthString isEqualToString:self.firstRowContent]) {
  1029. self.mSelectValue = self.firstRowContent;
  1030. }
  1031. }
  1032. } else if (self.pickerMode == BRDatePickerModeHMS) {
  1033. if (component == 0) {
  1034. self.hourIndex = row;
  1035. [self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:YES updateSecond:YES];
  1036. [self.pickerView reloadComponent:1];
  1037. [self.pickerView reloadComponent:2];
  1038. } else if (component == 1) {
  1039. self.minuteIndex = row;
  1040. [self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:NO updateSecond:YES];
  1041. [self.pickerView reloadComponent:2];
  1042. } else if (component == 2) {
  1043. self.secondIndex = row;
  1044. }
  1045. NSString *hourString = [self getHourString];
  1046. if (![hourString isEqualToString:self.lastRowContent] && ![hourString isEqualToString:self.firstRowContent]) {
  1047. if (self.hourArr.count * self.minuteArr.count * self.secondArr.count == 0) return;
  1048. int hour = [[self getHourString] intValue];
  1049. int minute = [[self getMinuteString] intValue];
  1050. int second = [[self getSecondString] intValue];
  1051. self.mSelectDate = [NSDate br_setHour:hour minute:minute second:second];
  1052. self.mSelectValue = [NSString stringWithFormat:@"%02d:%02d:%02d", hour, minute, second];
  1053. } else {
  1054. self.mSelectDate = self.addToNow ? [NSDate date] : nil;
  1055. if ([hourString isEqualToString:self.lastRowContent]) {
  1056. self.mSelectValue = self.lastRowContent;
  1057. } else if ([hourString isEqualToString:self.firstRowContent]) {
  1058. self.mSelectValue = self.firstRowContent;
  1059. }
  1060. }
  1061. } else if (self.pickerMode == BRDatePickerModeHM) {
  1062. if (component == 0) {
  1063. self.hourIndex = row;
  1064. [self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:YES updateSecond:NO];
  1065. [self.pickerView reloadComponent:1];
  1066. } else if (component == 1) {
  1067. self.minuteIndex = row;
  1068. }
  1069. NSString *hourString = [self getHourString];
  1070. if (![hourString isEqualToString:self.lastRowContent] && ![hourString isEqualToString:self.firstRowContent]) {
  1071. if (self.hourArr.count * self.minuteArr.count == 0) return;
  1072. int hour = [[self getHourString] intValue];
  1073. int minute = [[self getMinuteString] intValue];
  1074. self.mSelectDate = [NSDate br_setHour:hour minute:minute];
  1075. self.mSelectValue = [NSString stringWithFormat:@"%02d:%02d", hour, minute];
  1076. } else {
  1077. self.mSelectDate = self.addToNow ? [NSDate date] : nil;
  1078. if ([hourString isEqualToString:self.lastRowContent]) {
  1079. self.mSelectValue = self.lastRowContent;
  1080. } else if ([hourString isEqualToString:self.firstRowContent]) {
  1081. self.mSelectValue = self.firstRowContent;
  1082. }
  1083. }
  1084. } else if (self.pickerMode == BRDatePickerModeMS) {
  1085. if (component == 0) {
  1086. self.minuteIndex = row;
  1087. [self reloadDateArrayWithUpdateMonth:NO updateDay:NO updateHour:NO updateMinute:NO updateSecond:YES];
  1088. [self.pickerView reloadComponent:1];
  1089. } else if (component == 1) {
  1090. self.secondIndex = row;
  1091. }
  1092. NSString *minuteString = [self getMinuteString];
  1093. if (![minuteString isEqualToString:self.lastRowContent] && ![minuteString isEqualToString:self.firstRowContent]) {
  1094. if (self.minuteArr.count * self.secondArr.count == 0) return;
  1095. int minute = [[self getMinuteString] intValue];
  1096. int second = [[self getSecondString] intValue];
  1097. self.mSelectDate = [NSDate br_setMinute:minute second:second];
  1098. self.mSelectValue = [NSString stringWithFormat:@"%02d:%02d", minute, second];
  1099. } else {
  1100. self.mSelectDate = self.addToNow ? [NSDate date] : nil;
  1101. if ([minuteString isEqualToString:self.lastRowContent]) {
  1102. self.mSelectValue = self.lastRowContent;
  1103. } else if ([minuteString isEqualToString:self.firstRowContent]) {
  1104. self.mSelectValue = self.firstRowContent;
  1105. }
  1106. }
  1107. }
  1108. // 纠正选择日期(解决:由【自定义字符串】滚动到 其它日期时,或设置 minDate,日期联动不正确问题)
  1109. BOOL isLastRowContent = [lastSelectValue isEqualToString:self.lastRowContent] && ![self.mSelectValue isEqualToString:self.lastRowContent] && ![self.mSelectValue isEqualToString:self.firstRowContent];
  1110. BOOL isFirstRowContent = [lastSelectValue isEqualToString:self.firstRowContent] && ![self.mSelectValue isEqualToString:self.lastRowContent] && ![self.mSelectValue isEqualToString:self.firstRowContent];
  1111. if (isLastRowContent || isFirstRowContent || _isAdjustSelectRow) {
  1112. [self scrollToSelectDate:self.mSelectDate animated:NO];
  1113. }
  1114. // 禁止选择日期:回滚到上次选择的日期
  1115. if (self.nonSelectableDates && self.nonSelectableDates.count > 0 && ![self.mSelectValue isEqualToString:self.lastRowContent] && ![self.mSelectValue isEqualToString:self.firstRowContent]) {
  1116. for (NSDate *date in self.nonSelectableDates) {
  1117. if ([self br_compareDate:date targetDate:self.mSelectDate dateFormat:self.dateFormatter] == NSOrderedSame) {
  1118. // 如果当前的日期不可选择,就回滚到上次选择的日期
  1119. [self scrollToSelectDate:lastSelectDate animated:YES];
  1120. self.mSelectDate = lastSelectDate;
  1121. self.mSelectValue = lastSelectValue;
  1122. break;
  1123. }
  1124. }
  1125. }
  1126. // 滚动选择时执行 changeBlock 回调
  1127. if (self.changeBlock) {
  1128. self.changeBlock(self.mSelectDate, self.mSelectValue);
  1129. }
  1130. // 设置自动选择时,滚动选择时就执行 resultBlock
  1131. if (self.isAutoSelect) {
  1132. // 滚动完成后,执行block回调
  1133. if (self.resultBlock) {
  1134. self.resultBlock(self.mSelectDate, self.mSelectValue);
  1135. }
  1136. }
  1137. }
  1138. // 设置行高
  1139. - (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component {
  1140. return self.pickerStyle.rowHeight;
  1141. }
  1142. #pragma mark - 日期选择器1 滚动后的响应事件
  1143. - (void)didSelectValueChanged:(UIDatePicker *)sender {
  1144. // 读取日期:datePicker.date
  1145. self.mSelectDate = sender.date;
  1146. if (_datePickerMode != UIDatePickerModeCountDownTimer) {
  1147. BOOL selectLessThanMin = [self br_compareDate:self.mSelectDate targetDate:self.minDate dateFormat:self.dateFormatter] == NSOrderedAscending;
  1148. BOOL selectMoreThanMax = [self br_compareDate:self.mSelectDate targetDate:self.maxDate dateFormat:self.dateFormatter] == NSOrderedDescending;
  1149. if (selectLessThanMin) {
  1150. self.mSelectDate = self.minDate;
  1151. }
  1152. if (selectMoreThanMax) {
  1153. self.mSelectDate = self.maxDate;
  1154. }
  1155. }
  1156. [self.datePicker setDate:self.mSelectDate animated:YES];
  1157. self.mSelectValue = [self br_stringFromDate:self.mSelectDate dateFormat:self.dateFormatter];
  1158. // 滚动选择时执行 changeBlock 回调
  1159. if (self.changeBlock) {
  1160. self.changeBlock(self.mSelectDate, self.mSelectValue);
  1161. }
  1162. // 设置自动选择时,滚动选择时就执行 resultBlock
  1163. if (self.isAutoSelect) {
  1164. // 滚动完成后,执行block回调
  1165. if (self.resultBlock) {
  1166. self.resultBlock(self.mSelectDate, self.mSelectValue);
  1167. }
  1168. }
  1169. }
  1170. #pragma mark - 重写父类方法
  1171. - (void)reloadData {
  1172. // 1.处理数据源
  1173. [self handlerPickerData];
  1174. if (self.style == BRDatePickerStyleSystem) {
  1175. // 2.刷新选择器(重新设置相关值)
  1176. self.datePicker.datePickerMode = _datePickerMode;
  1177. #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130400 // 编译时检查SDK版本,iOS SDK 13.4 以后版本的处理
  1178. if (@available(iOS 13.4, *)) {
  1179. // 适配 iOS14 以后 UIDatePicker 的显示样式
  1180. self.datePicker.preferredDatePickerStyle = UIDatePickerStyleWheels;
  1181. // 设置 datePicker 的 frame(在iOS14里,UIDatePicker 的 frame 赋值必须放在 datePickerMode 赋值之后, 否则 frame 不会生效)
  1182. CGFloat pickerHeaderViewHeight = self.pickerHeaderView ? self.pickerHeaderView.bounds.size.height : 0;
  1183. self.datePicker.frame = CGRectMake(0, self.pickerStyle.titleBarHeight + pickerHeaderViewHeight, self.keyView.bounds.size.width, self.pickerStyle.pickerHeight);
  1184. } else
  1185. #endif
  1186. {
  1187. // Fallback on earlier versions
  1188. }
  1189. // 设置该 UIDatePicker 的国际化 Locale
  1190. self.datePicker.locale = [[NSLocale alloc]initWithLocaleIdentifier:self.pickerStyle.language];
  1191. if (self.timeZone) {
  1192. self.datePicker.timeZone = self.timeZone;
  1193. }
  1194. self.datePicker.calendar = self.calendar;
  1195. // 设置农历日期
  1196. //self.datePicker.calendar = [[NSCalendar alloc]initWithCalendarIdentifier:NSCalendarIdentifierChinese];
  1197. if (self.minDate) {
  1198. self.datePicker.minimumDate = self.minDate;
  1199. }
  1200. if (self.maxDate) {
  1201. self.datePicker.maximumDate = self.maxDate;
  1202. }
  1203. if (_datePickerMode == UIDatePickerModeCountDownTimer && self.countDownDuration > 0) {
  1204. self.datePicker.countDownDuration = self.countDownDuration;
  1205. }
  1206. if (self.minuteInterval > 1) {
  1207. self.datePicker.minuteInterval = self.minuteInterval;
  1208. }
  1209. // 3.滚动到选择的日期
  1210. [self.datePicker setDate:self.mSelectDate animated:NO];
  1211. } else if (self.style == BRDatePickerStyleCustom) {
  1212. // 2.刷新选择器
  1213. [self.pickerView reloadAllComponents];
  1214. // 3.滚动到选择的日期
  1215. if (self.selectValue && ([self.selectValue isEqualToString:self.lastRowContent] || [self.selectValue isEqualToString:self.firstRowContent])) {
  1216. [self scrollToCustomString:NO];
  1217. } else {
  1218. [self scrollToSelectDate:self.mSelectDate animated:NO];
  1219. }
  1220. }
  1221. }
  1222. - (void)addPickerToView:(UIView *)view {
  1223. _containerView = view;
  1224. [self setupDateFormatter:self.pickerMode];
  1225. // 1.添加日期选择器
  1226. if (self.style == BRDatePickerStyleSystem) {
  1227. [self setupPickerView:self.datePicker toView:view];
  1228. } else if (self.style == BRDatePickerStyleCustom) {
  1229. [self setupPickerView:self.pickerView toView:view];
  1230. if (self.showUnitType == BRShowUnitTypeOnlyCenter) {
  1231. // 添加日期单位到选择器
  1232. [self addUnitLabel];
  1233. }
  1234. }
  1235. // ③添加中间选择行的两条分割线
  1236. if (self.pickerStyle.clearPickerNewStyle) {
  1237. [self.pickerStyle addSeparatorLineView:self.pickerView];
  1238. }
  1239. // 2.绑定数据
  1240. [self reloadData];
  1241. __weak typeof(self) weakSelf = self;
  1242. self.doneBlock = ^{
  1243. // 点击确定按钮后,执行block回调
  1244. [weakSelf removePickerFromView:view];
  1245. if (weakSelf.resultBlock) {
  1246. weakSelf.resultBlock(weakSelf.mSelectDate, weakSelf.mSelectValue);
  1247. }
  1248. };
  1249. [super addPickerToView:view];
  1250. }
  1251. #pragma mark - 添加日期单位到选择器
  1252. - (void)addUnitLabel {
  1253. if (self.unitLabelArr.count > 0) {
  1254. for (UILabel *unitLabel in self.unitLabelArr) {
  1255. [unitLabel removeFromSuperview];
  1256. }
  1257. self.unitLabelArr = nil;
  1258. }
  1259. self.unitLabelArr = [self setupPickerUnitLabel:self.pickerView unitArr:self.unitArr];
  1260. }
  1261. #pragma mark - 重写父类方法
  1262. - (void)addSubViewToPicker:(UIView *)customView {
  1263. if (self.style == BRDatePickerStyleSystem) {
  1264. [self.datePicker addSubview:customView];
  1265. } else if (self.style == BRDatePickerStyleCustom) {
  1266. [self.pickerView addSubview:customView];
  1267. }
  1268. }
  1269. #pragma mark - 弹出选择器视图
  1270. - (void)show {
  1271. [self addPickerToView:nil];
  1272. }
  1273. #pragma mark - 关闭选择器视图
  1274. - (void)dismiss {
  1275. [self removePickerFromView:nil];
  1276. }
  1277. #pragma mark - setter 方法
  1278. - (void)setPickerMode:(BRDatePickerMode)pickerMode {
  1279. _pickerMode = pickerMode;
  1280. // 非空,表示二次设置
  1281. if (_datePicker || _pickerView) {
  1282. BRDatePickerStyle lastStyle = self.style;
  1283. [self setupDateFormatter:pickerMode];
  1284. // 系统样式 切换到 自定义样式
  1285. if (lastStyle == BRDatePickerStyleSystem && self.style == BRDatePickerStyleCustom) {
  1286. [self.datePicker removeFromSuperview];
  1287. [self setupPickerView:self.pickerView toView:_containerView];
  1288. }
  1289. // 自定义样式 切换到 系统样式
  1290. if (lastStyle == BRDatePickerStyleCustom && self.style == BRDatePickerStyleSystem) {
  1291. [self.pickerView removeFromSuperview];
  1292. [self setupPickerView:self.datePicker toView:_containerView];
  1293. }
  1294. // 刷新选择器数据
  1295. [self reloadData];
  1296. if (self.style == BRDatePickerStyleCustom && self.showUnitType == BRShowUnitTypeOnlyCenter) {
  1297. // 添加日期单位到选择器
  1298. [self addUnitLabel];
  1299. }
  1300. }
  1301. }
  1302. - (void)setAddToNow:(BOOL)addToNow {
  1303. _addToNow = addToNow;
  1304. if (addToNow) {
  1305. _maxDate = [NSDate date];
  1306. _lastRowContent = [NSBundle br_localizedStringForKey:@"至今" language:self.pickerStyle.language];
  1307. }
  1308. }
  1309. - (void)setLastRowContent:(NSString *)lastRowContent {
  1310. if (!_addToNow) {
  1311. _lastRowContent = lastRowContent;
  1312. }
  1313. }
  1314. // 支持动态设置选择的值
  1315. - (void)setSelectDate:(NSDate *)selectDate {
  1316. _selectDate = selectDate;
  1317. _mSelectDate = selectDate;
  1318. if (_datePicker || _pickerView) {
  1319. // 刷新选择器数据
  1320. [self reloadData];
  1321. }
  1322. }
  1323. - (void)setSelectValue:(NSString *)selectValue {
  1324. _selectValue = selectValue;
  1325. _mSelectValue = selectValue;
  1326. if (_datePicker || _pickerView) {
  1327. // 刷新选择器数据
  1328. [self reloadData];
  1329. }
  1330. }
  1331. - (void)setAddCustomString:(NSString *)addCustomString {
  1332. self.lastRowContent = addCustomString;
  1333. }
  1334. #pragma mark - getter 方法
  1335. - (NSArray *)yearArr {
  1336. if (!_yearArr) {
  1337. _yearArr = [NSArray array];
  1338. }
  1339. return _yearArr;
  1340. }
  1341. - (NSArray *)monthArr {
  1342. if (!_monthArr) {
  1343. _monthArr = [NSArray array];
  1344. }
  1345. return _monthArr;
  1346. }
  1347. - (NSArray *)dayArr {
  1348. if (!_dayArr) {
  1349. _dayArr = [NSArray array];
  1350. }
  1351. return _dayArr;
  1352. }
  1353. - (NSArray *)hourArr {
  1354. if (!_hourArr) {
  1355. _hourArr = [NSArray array];
  1356. }
  1357. return _hourArr;
  1358. }
  1359. - (NSArray *)minuteArr {
  1360. if (!_minuteArr) {
  1361. _minuteArr = [NSArray array];
  1362. }
  1363. return _minuteArr;
  1364. }
  1365. - (NSArray *)secondArr {
  1366. if (!_secondArr) {
  1367. _secondArr = [NSArray array];
  1368. }
  1369. return _secondArr;
  1370. }
  1371. - (NSInteger)minuteInterval {
  1372. if (_minuteInterval < 1 || _minuteInterval > 30) {
  1373. _minuteInterval = 1;
  1374. }
  1375. return _minuteInterval;
  1376. }
  1377. - (NSInteger)secondInterval {
  1378. if (_secondInterval < 1 || _secondInterval > 30) {
  1379. _secondInterval = 1;
  1380. }
  1381. return _secondInterval;
  1382. }
  1383. - (NSArray *)unitArr {
  1384. if (!_unitArr) {
  1385. _unitArr = [NSArray array];
  1386. }
  1387. return _unitArr;
  1388. }
  1389. - (NSArray<UILabel *> *)unitLabelArr {
  1390. if (!_unitLabelArr) {
  1391. _unitLabelArr = [NSArray array];
  1392. }
  1393. return _unitLabelArr;
  1394. }
  1395. - (NSArray<NSString *> *)monthNames {
  1396. if (!_monthNames) {
  1397. _monthNames = [NSArray array];
  1398. }
  1399. return _monthNames;
  1400. }
  1401. - (NSString *)getYearString {
  1402. NSInteger index = 0;
  1403. if (self.yearIndex >= 0 && self.yearIndex < self.yearArr.count) {
  1404. index = self.yearIndex;
  1405. }
  1406. return [self.yearArr objectAtIndex:index];
  1407. }
  1408. - (NSString *)getMonthString {
  1409. NSInteger index = 0;
  1410. if (self.monthIndex >= 0 && self.monthIndex < self.monthArr.count) {
  1411. index = self.monthIndex;
  1412. }
  1413. return [self.monthArr objectAtIndex:index];
  1414. }
  1415. - (NSString *)getDayString {
  1416. NSInteger index = 0;
  1417. if (self.dayIndex >= 0 && self.dayIndex < self.dayArr.count) {
  1418. index = self.dayIndex;
  1419. }
  1420. return [self.dayArr objectAtIndex:index];
  1421. }
  1422. - (NSString *)getHourString {
  1423. NSInteger index = 0;
  1424. if (self.hourIndex >= 0 && self.hourIndex < self.hourArr.count) {
  1425. index = self.hourIndex;
  1426. }
  1427. return [self.hourArr objectAtIndex:index];
  1428. }
  1429. - (NSString *)getMinuteString {
  1430. NSInteger index = 0;
  1431. if (self.minuteIndex >= 0 && self.minuteIndex < self.minuteArr.count) {
  1432. index = self.minuteIndex;
  1433. }
  1434. return [self.minuteArr objectAtIndex:index];
  1435. }
  1436. - (NSString *)getSecondString {
  1437. NSInteger index = 0;
  1438. if (self.secondIndex >= 0 && self.secondIndex < self.secondArr.count) {
  1439. index = self.secondIndex;
  1440. }
  1441. return [self.secondArr objectAtIndex:index];
  1442. }
  1443. @end