BRDatePickerView+BR.m 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  1. //
  2. // BRDatePickerView+BR.m
  3. // BRPickerViewDemo
  4. //
  5. // Created by renbo on 2020/6/16.
  6. // Copyright © 2020 irenb. All rights reserved.
  7. //
  8. // 最新代码下载地址:https://github.com/91renb/BRPickerView
  9. #import "BRDatePickerView+BR.h"
  10. #import "NSBundle+BRPickerView.h"
  11. BRSYNTH_DUMMY_CLASS(BRDatePickerView_BR)
  12. //////////////////////////////////////////
  13. /// 本分类主要是给 BRDatePickerView 文件瘦身
  14. //////////////////////////////////////////
  15. @implementation BRDatePickerView (BR)
  16. #pragma mark - 最小日期
  17. - (NSDate *)handlerMinDate:(NSDate *)minDate {
  18. if (!minDate) {
  19. if (self.pickerMode == BRDatePickerModeMDHM) {
  20. minDate = [NSDate br_setMonth:1 day:1 hour:0 minute:0];
  21. } else if (self.pickerMode == BRDatePickerModeMD) {
  22. minDate = [NSDate br_setMonth:1 day:1];
  23. } else if (self.pickerMode == BRDatePickerModeTime || self.pickerMode == BRDatePickerModeCountDownTimer || self.pickerMode == BRDatePickerModeHM) {
  24. minDate = [NSDate br_setHour:0 minute:0];
  25. } else if (self.pickerMode == BRDatePickerModeHMS) {
  26. minDate = [NSDate br_setHour:0 minute:0 second:0];
  27. } else if (self.pickerMode == BRDatePickerModeMS) {
  28. minDate = [NSDate br_setMinute:0 second:0];
  29. } else {
  30. minDate = [NSDate distantPast]; // 遥远的过去的一个时间点
  31. }
  32. }
  33. return minDate;
  34. }
  35. #pragma mark - 最大日期
  36. - (NSDate *)handlerMaxDate:(NSDate *)maxDate {
  37. if (!maxDate) {
  38. if (self.pickerMode == BRDatePickerModeMDHM) {
  39. maxDate = [NSDate br_setMonth:12 day:31 hour:23 minute:59];
  40. } else if (self.pickerMode == BRDatePickerModeMD) {
  41. maxDate = [NSDate br_setMonth:12 day:31];
  42. } else if (self.pickerMode == BRDatePickerModeTime || self.pickerMode == BRDatePickerModeCountDownTimer || self.pickerMode == BRDatePickerModeHM) {
  43. maxDate = [NSDate br_setHour:23 minute:59];
  44. } else if (self.pickerMode == BRDatePickerModeHMS) {
  45. maxDate = [NSDate br_setHour:23 minute:59 second:59];
  46. } else if (self.pickerMode == BRDatePickerModeMS) {
  47. maxDate = [NSDate br_setMinute:59 second:59];
  48. } else {
  49. maxDate = [NSDate distantFuture]; // 遥远的未来的一个时间点
  50. }
  51. }
  52. return maxDate;
  53. }
  54. #pragma mark - 默认选中的日期
  55. - (NSDate *)handlerSelectDate:(NSDate *)selectDate dateFormat:(NSString *)dateFormat {
  56. // selectDate 优先级高于 selectValue(推荐使用 selectDate 设置默认选中的日期)
  57. if (!selectDate) {
  58. if (self.selectValue && self.selectValue.length > 0) {
  59. if (self.pickerMode == BRDatePickerModeYMDH && self.isShowAMAndPM) {
  60. NSString *firstString = [[self.selectValue componentsSeparatedByString:@" "] firstObject];
  61. NSString *lastString = [[self.selectValue componentsSeparatedByString:@" "] lastObject];
  62. if ([lastString isEqualToString:[self getAMText]]) {
  63. self.selectValue = [NSString stringWithFormat:@"%@ 00", firstString];
  64. }
  65. if ([lastString isEqualToString:[self getPMText]]) {
  66. self.selectValue = [NSString stringWithFormat:@"%@ 12", firstString];
  67. }
  68. }
  69. NSDate *date = nil;
  70. if ([self.selectValue isEqualToString:self.lastRowContent]) {
  71. date = self.addToNow ? [NSDate date] : nil;
  72. } else if ([self.selectValue isEqualToString:self.firstRowContent]) {
  73. date = nil;
  74. } else {
  75. date = [self br_dateFromString:self.selectValue dateFormat:dateFormat];
  76. if (!date) {
  77. BRErrorLog(@"参数异常!字符串 selectValue 的正确格式是:%@", dateFormat);
  78. NSAssert(date, @"参数异常!请检查字符串 selectValue 的格式");
  79. date = [NSDate date]; // 默认值参数格式错误时,重置/忽略默认值,防止在 Release 环境下崩溃!
  80. }
  81. if (self.pickerMode == BRDatePickerModeMDHM) {
  82. selectDate = [NSDate br_setMonth:date.br_month day:date.br_day hour:date.br_hour minute:date.br_minute];
  83. } else if (self.pickerMode == BRDatePickerModeMD) {
  84. selectDate = [NSDate br_setMonth:date.br_month day:date.br_day];
  85. } else if (self.pickerMode == BRDatePickerModeTime || self.pickerMode == BRDatePickerModeCountDownTimer || self.pickerMode == BRDatePickerModeHM) {
  86. selectDate = [NSDate br_setHour:date.br_hour minute:date.br_minute];
  87. } else if (self.pickerMode == BRDatePickerModeHMS) {
  88. selectDate = [NSDate br_setHour:date.br_hour minute:date.br_minute second:date.br_second];
  89. } else if (self.pickerMode == BRDatePickerModeMS) {
  90. selectDate = [NSDate br_setMinute:date.br_minute second:date.br_second];
  91. } else {
  92. selectDate = date;
  93. }
  94. }
  95. } else {
  96. // 不设置默认日期
  97. if (self.pickerMode == BRDatePickerModeTime ||
  98. self.pickerMode == BRDatePickerModeCountDownTimer ||
  99. self.pickerMode == BRDatePickerModeHM ||
  100. self.pickerMode == BRDatePickerModeHMS ||
  101. self.pickerMode == BRDatePickerModeMS) {
  102. // 默认选中最小日期
  103. selectDate = self.minDate;
  104. } else {
  105. if (self.minuteInterval > 1 || self.secondInterval > 1) {
  106. NSDate *date = [NSDate date];
  107. NSInteger minute = self.minDate.br_minute % self.minuteInterval == 0 ? self.minDate.br_minute : 0;
  108. NSInteger second = self.minDate.br_second % self.secondInterval == 0 ? self.minDate.br_second : 0;
  109. selectDate = [NSDate br_setYear:date.br_year month:date.br_month day:date.br_day hour:date.br_hour minute:minute second:second];
  110. } else {
  111. // 默认选中今天的日期
  112. selectDate = [NSDate date];
  113. }
  114. }
  115. }
  116. }
  117. // 判断日期是否超过边界限制
  118. BOOL selectLessThanMin = [self br_compareDate:selectDate targetDate:self.minDate dateFormat:dateFormat] == NSOrderedAscending;
  119. BOOL selectMoreThanMax = [self br_compareDate:selectDate targetDate:self.maxDate dateFormat:dateFormat] == NSOrderedDescending;
  120. if (selectLessThanMin) {
  121. BRErrorLog(@"默认选择的日期不能小于最小日期!");
  122. selectDate = self.minDate;
  123. }
  124. if (selectMoreThanMax) {
  125. BRErrorLog(@"默认选择的日期不能大于最大日期!");
  126. selectDate = self.maxDate;
  127. }
  128. return selectDate;
  129. }
  130. #pragma mark - NSDate 转 NSString
  131. - (NSString *)br_stringFromDate:(NSDate *)date dateFormat:(NSString *)dateFormat {
  132. return [NSDate br_stringFromDate:date dateFormat:dateFormat timeZone:self.timeZone language:self.pickerStyle.language];
  133. }
  134. #pragma mark - NSString 转 NSDate
  135. - (NSDate *)br_dateFromString:(NSString *)dateString dateFormat:(NSString *)dateFormat {
  136. return [NSDate br_dateFromString:dateString dateFormat:dateFormat timeZone:self.timeZone language:self.pickerStyle.language];
  137. }
  138. #pragma mark - 比较两个日期大小(可以指定比较级数,即按指定格式进行比较)
  139. - (NSComparisonResult)br_compareDate:(NSDate *)date targetDate:(NSDate *)targetDate dateFormat:(NSString *)dateFormat {
  140. NSString *dateString1 = [self br_stringFromDate:date dateFormat:dateFormat];
  141. NSString *dateString2 = [self br_stringFromDate:targetDate dateFormat:dateFormat];
  142. NSDate *date1 = [self br_dateFromString:dateString1 dateFormat:dateFormat];
  143. NSDate *date2 = [self br_dateFromString:dateString2 dateFormat:dateFormat];
  144. if ([date1 compare:date2] == NSOrderedDescending) {
  145. return 1; // 大于
  146. } else if ([date1 compare:date2] == NSOrderedAscending) {
  147. return -1; // 小于
  148. } else {
  149. return 0; // 等于
  150. }
  151. }
  152. #pragma mark - 获取 yearArr 数组
  153. - (NSArray *)getYearArr {
  154. NSMutableArray *tempArr = [[NSMutableArray alloc]init];
  155. for (NSInteger i = self.minDate.br_year; i <= self.maxDate.br_year; i++) {
  156. [tempArr addObject:[self getYearNumber:i]];
  157. }
  158. if (self.isDescending) {
  159. NSArray *reversedArr = [[tempArr reverseObjectEnumerator] allObjects];
  160. tempArr = [reversedArr mutableCopy];
  161. }
  162. // 判断是否需要添加【自定义字符串】
  163. if (self.lastRowContent || self.firstRowContent) {
  164. switch (self.pickerMode) {
  165. case BRDatePickerModeYMDHMS:
  166. case BRDatePickerModeYMDHM:
  167. case BRDatePickerModeYMDH:
  168. case BRDatePickerModeYMD:
  169. case BRDatePickerModeYM:
  170. case BRDatePickerModeY:
  171. {
  172. if (self.lastRowContent) {
  173. [tempArr addObject:self.lastRowContent];
  174. }
  175. if (self.firstRowContent) {
  176. [tempArr insertObject:self.firstRowContent atIndex:0];
  177. }
  178. }
  179. break;
  180. default:
  181. break;
  182. }
  183. }
  184. return [tempArr copy];
  185. }
  186. #pragma mark - 获取 monthArr 数组
  187. - (NSArray *)getMonthArr:(NSInteger)year {
  188. NSInteger startMonth = 1;
  189. NSInteger endMonth = 12;
  190. if (year == self.minDate.br_year) {
  191. startMonth = self.minDate.br_month;
  192. }
  193. if (year == self.maxDate.br_year) {
  194. endMonth = self.maxDate.br_month;
  195. }
  196. NSMutableArray *tempArr = [[NSMutableArray alloc]init];
  197. for (NSInteger i = startMonth; i <= endMonth; i++) {
  198. [tempArr addObject:[self getMDHMSNumber:i]];
  199. }
  200. if (self.isDescending) {
  201. NSArray *reversedArr = [[tempArr reverseObjectEnumerator] allObjects];
  202. tempArr = [reversedArr mutableCopy];
  203. }
  204. // 判断是否需要添加【自定义字符串】
  205. if (self.lastRowContent || self.firstRowContent) {
  206. switch (self.pickerMode) {
  207. case BRDatePickerModeMDHM:
  208. case BRDatePickerModeMD:
  209. {
  210. if (self.lastRowContent) {
  211. [tempArr addObject:self.lastRowContent];
  212. }
  213. if (self.firstRowContent) {
  214. [tempArr insertObject:self.firstRowContent atIndex:0];
  215. }
  216. }
  217. break;
  218. default:
  219. break;
  220. }
  221. }
  222. return [tempArr copy];
  223. }
  224. #pragma mark - 获取 dayArr 数组
  225. - (NSArray *)getDayArr:(NSInteger)year month:(NSInteger)month {
  226. NSInteger startDay = 1;
  227. NSInteger endDay = [NSDate br_getDaysInYear:year month:month];
  228. if (year == self.minDate.br_year && month == self.minDate.br_month) {
  229. startDay = self.minDate.br_day;
  230. }
  231. if (year == self.maxDate.br_year && month == self.maxDate.br_month) {
  232. endDay = self.maxDate.br_day;
  233. }
  234. NSMutableArray *tempArr = [[NSMutableArray alloc]init];
  235. for (NSInteger i = startDay; i <= endDay; i++) {
  236. [tempArr addObject:[self getMDHMSNumber:i]];
  237. }
  238. if (self.isDescending) {
  239. return [[tempArr reverseObjectEnumerator] allObjects];
  240. }
  241. return [tempArr copy];
  242. }
  243. #pragma mark - 获取 hourArr 数组
  244. - (NSArray *)getHourArr:(NSInteger)year month:(NSInteger)month day:(NSInteger)day {
  245. if (self.pickerMode == BRDatePickerModeYMDH && self.isShowAMAndPM) {
  246. return @[[self getAMText], [self getPMText]];
  247. }
  248. NSInteger startHour = 0;
  249. NSInteger endHour = 23;
  250. if (year == self.minDate.br_year && month == self.minDate.br_month && day == self.minDate.br_day) {
  251. startHour = self.minDate.br_hour;
  252. }
  253. if (year == self.maxDate.br_year && month == self.maxDate.br_month && day == self.maxDate.br_day) {
  254. endHour = self.maxDate.br_hour;
  255. }
  256. NSMutableArray *tempArr = [[NSMutableArray alloc]init];
  257. for (NSInteger i = startHour; i <= endHour; i++) {
  258. [tempArr addObject:[self getMDHMSNumber:i]];
  259. }
  260. if (self.isDescending) {
  261. NSArray *reversedArr = [[tempArr reverseObjectEnumerator] allObjects];
  262. tempArr = [reversedArr mutableCopy];
  263. }
  264. // 判断是否需要添加【自定义字符串】
  265. if (self.lastRowContent || self.firstRowContent) {
  266. switch (self.pickerMode) {
  267. case BRDatePickerModeHMS:
  268. case BRDatePickerModeHM:
  269. {
  270. if (self.lastRowContent) {
  271. [tempArr addObject:self.lastRowContent];
  272. }
  273. if (self.firstRowContent) {
  274. [tempArr insertObject:self.firstRowContent atIndex:0];
  275. }
  276. }
  277. break;
  278. default:
  279. break;
  280. }
  281. }
  282. return [tempArr copy];
  283. }
  284. #pragma mark - 获取 minuteArr 数组
  285. - (NSArray *)getMinuteArr:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour {
  286. NSInteger startMinute = 0;
  287. NSInteger endMinute = 59;
  288. if (year == self.minDate.br_year && month == self.minDate.br_month && day == self.minDate.br_day && hour == self.minDate.br_hour) {
  289. startMinute = self.minDate.br_minute;
  290. }
  291. if (year == self.maxDate.br_year && month == self.maxDate.br_month && day == self.maxDate.br_day && hour == self.maxDate.br_hour) {
  292. endMinute = self.maxDate.br_minute;
  293. }
  294. NSMutableArray *tempArr = [[NSMutableArray alloc]init];
  295. for (NSInteger i = startMinute; i <= endMinute; i += self.minuteInterval) {
  296. [tempArr addObject:[self getMDHMSNumber:i]];
  297. }
  298. if (self.isDescending) {
  299. NSArray *reversedArr = [[tempArr reverseObjectEnumerator] allObjects];
  300. tempArr = [reversedArr mutableCopy];
  301. }
  302. // 判断是否需要添加【自定义字符串】
  303. if (self.lastRowContent || self.firstRowContent) {
  304. switch (self.pickerMode) {
  305. case BRDatePickerModeMS:
  306. {
  307. if (self.lastRowContent) {
  308. [tempArr addObject:self.lastRowContent];
  309. }
  310. if (self.firstRowContent) {
  311. [tempArr insertObject:self.firstRowContent atIndex:0];
  312. }
  313. }
  314. break;
  315. default:
  316. break;
  317. }
  318. }
  319. return [tempArr copy];
  320. }
  321. #pragma mark - 获取 secondArr 数组
  322. - (NSArray *)getSecondArr:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute {
  323. NSInteger startSecond = 0;
  324. NSInteger endSecond = 59;
  325. 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) {
  326. startSecond = self.minDate.br_second;
  327. }
  328. 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) {
  329. endSecond = self.maxDate.br_second;
  330. }
  331. NSMutableArray *tempArr = [[NSMutableArray alloc]init];
  332. for (NSInteger i = startSecond; i <= endSecond; i += self.secondInterval) {
  333. [tempArr addObject:[self getMDHMSNumber:i]];
  334. }
  335. if (self.isDescending) {
  336. return [[tempArr reverseObjectEnumerator] allObjects];
  337. }
  338. return [tempArr copy];
  339. }
  340. #pragma mark - 添加 pickerView
  341. - (void)setupPickerView:(UIView *)pickerView toView:(UIView *)view {
  342. if (view) {
  343. // 立即刷新容器视图 view 的布局(防止 view 使用自动布局时,选择器视图无法正常显示)
  344. [view setNeedsLayout];
  345. [view layoutIfNeeded];
  346. self.frame = view.bounds;
  347. CGFloat pickerHeaderViewHeight = self.pickerHeaderView ? self.pickerHeaderView.bounds.size.height : 0;
  348. CGFloat pickerFooterViewHeight = self.pickerFooterView ? self.pickerFooterView.bounds.size.height : 0;
  349. pickerView.frame = CGRectMake(0, pickerHeaderViewHeight, view.bounds.size.width, view.bounds.size.height - pickerHeaderViewHeight - pickerFooterViewHeight);
  350. [self addSubview:pickerView];
  351. } else {
  352. [self.alertView addSubview:pickerView];
  353. }
  354. }
  355. #pragma mark - 获取日期单位
  356. - (NSArray *)setupPickerUnitLabel:(UIPickerView *)pickerView unitArr:(NSArray *)unitArr {
  357. NSMutableArray *tempArr = [[NSMutableArray alloc]init];
  358. for (NSInteger i = 0; i < pickerView.numberOfComponents; i++) {
  359. // label宽度
  360. CGFloat labelWidth = pickerView.bounds.size.width / pickerView.numberOfComponents;
  361. // 根据占位文本长度去计算宽度
  362. NSString *tempText = @"00";
  363. if (i == 0) {
  364. switch (self.pickerMode) {
  365. case BRDatePickerModeYMDHMS:
  366. case BRDatePickerModeYMDHM:
  367. case BRDatePickerModeYMDH:
  368. case BRDatePickerModeYMD:
  369. case BRDatePickerModeYM:
  370. case BRDatePickerModeY:
  371. {
  372. tempText = @"0123";
  373. }
  374. break;
  375. default:
  376. break;
  377. }
  378. }
  379. // 文本宽度
  380. CGFloat labelTextWidth = [tempText boundingRectWithSize:CGSizeMake(MAXFLOAT, self.pickerStyle.rowHeight)
  381. options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
  382. attributes:@{NSFontAttributeName: self.pickerStyle.pickerTextFont}
  383. context:nil].size.width;
  384. // 单位label
  385. UILabel *unitLabel = [[UILabel alloc]init];
  386. unitLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
  387. unitLabel.backgroundColor = [UIColor clearColor];
  388. if (self.pickerMode != BRDatePickerModeYMDHMS) {
  389. unitLabel.textAlignment = NSTextAlignmentCenter;
  390. }
  391. unitLabel.font = self.pickerStyle.dateUnitTextFont;
  392. unitLabel.textColor = self.pickerStyle.dateUnitTextColor;
  393. // 字体自适应属性
  394. unitLabel.adjustsFontSizeToFitWidth = YES;
  395. // 自适应最小字体缩放比例
  396. unitLabel.minimumScaleFactor = 0.5f;
  397. unitLabel.text = (unitArr.count > 0 && i < unitArr.count) ? unitArr[i] : nil;
  398. CGFloat originX = i * labelWidth + labelWidth / 2.0 + labelTextWidth / 2.0 + self.pickerStyle.dateUnitOffsetX;
  399. CGFloat originY = (pickerView.frame.size.height - self.pickerStyle.rowHeight) / 2 + self.pickerStyle.dateUnitOffsetY;
  400. unitLabel.frame = CGRectMake(originX, originY, MAX(self.pickerStyle.rowHeight, labelTextWidth), self.pickerStyle.rowHeight);
  401. [tempArr addObject:unitLabel];
  402. [pickerView addSubview:unitLabel];
  403. }
  404. return [tempArr copy];
  405. }
  406. - (NSString *)getYearNumber:(NSInteger)year {
  407. NSString *yearString = [NSString stringWithFormat:@"%@", @(year)];
  408. if (self.isNumberFullName) {
  409. yearString = [NSString stringWithFormat:@"%04d", [yearString intValue]];
  410. }
  411. return yearString;
  412. }
  413. - (NSString *)getMDHMSNumber:(NSInteger)number {
  414. NSString *string = [NSString stringWithFormat:@"%@", @(number)];
  415. if (self.isNumberFullName) {
  416. string = [NSString stringWithFormat:@"%02d", [string intValue]];
  417. }
  418. return string;
  419. }
  420. - (NSString *)getYearText:(NSArray *)yearArr row:(NSInteger)row {
  421. NSInteger index = 0;
  422. if (row >= 0) {
  423. index = MIN(row, yearArr.count - 1);
  424. }
  425. NSString *yearString = [yearArr objectAtIndex:index];
  426. if ((self.lastRowContent && [yearString isEqualToString:self.lastRowContent]) || (self.firstRowContent && [yearString isEqualToString:self.firstRowContent])) {
  427. return yearString;
  428. }
  429. NSString *yearUnit = self.showUnitType == BRShowUnitTypeAll ? [self getYearUnit] : @"";
  430. return [NSString stringWithFormat:@"%@%@", yearString, yearUnit];
  431. }
  432. - (NSString *)getMonthText:(NSArray *)monthArr row:(NSInteger)row {
  433. NSInteger index = 0;
  434. if (row >= 0) {
  435. index = MIN(row, monthArr.count - 1);
  436. }
  437. NSString *monthString = [monthArr objectAtIndex:index];
  438. // 首行/末行是自定义字符串,直接返回
  439. if ((self.firstRowContent && [monthString isEqualToString:self.firstRowContent]) || (self.lastRowContent && [monthString isEqualToString:self.lastRowContent])) {
  440. return monthString;
  441. }
  442. // 自定义月份数据源
  443. if (self.monthNames && self.monthNames.count > 0) {
  444. NSInteger index = [monthString integerValue] - 1;
  445. monthString = (index >= 0 && index < self.monthNames.count) ? self.monthNames[index] : @"";
  446. } else {
  447. if (![self.pickerStyle.language hasPrefix:@"zh"] && (self.pickerMode == BRDatePickerModeYMD || self.pickerMode == BRDatePickerModeYM)) {
  448. // 非中文环境:月份显示英文名称
  449. // monthNames = @[@"Jan", @"Feb", @"Mar", @"Apr", @"May", @"Jun", @"Jul", @"Aug", @"Sep", @"Oct", @"Nov", @"Dec"];
  450. NSArray *monthNames = @[@"January", @"February", @"March", @"April", @"May", @"June", @"July", @"August", @"September", @"October", @"November", @"December"];
  451. NSInteger index = [monthString integerValue] - 1;
  452. monthString = (index >= 0 && index < monthNames.count) ? monthNames[index] : @"";
  453. } else {
  454. // 中文环境:月份显示数字
  455. NSString *monthUnit = self.showUnitType == BRShowUnitTypeAll ? [self getMonthUnit] : @"";
  456. monthString = [NSString stringWithFormat:@"%@%@", monthString, monthUnit];
  457. }
  458. }
  459. return monthString;
  460. }
  461. - (NSString *)getDayText:(NSArray *)dayArr row:(NSInteger)row mSelectDate:(NSDate *)mSelectDate {
  462. NSInteger index = 0;
  463. if (row >= 0) {
  464. index = MIN(row, dayArr.count - 1);
  465. }
  466. NSString *dayString = [dayArr objectAtIndex:index];
  467. if (self.isShowToday && mSelectDate.br_year == [NSDate date].br_year && mSelectDate.br_month == [NSDate date].br_month && [dayString integerValue] == [NSDate date].br_day) {
  468. return [NSBundle br_localizedStringForKey:@"今天" language:self.pickerStyle.language];
  469. }
  470. NSString *dayUnit = self.showUnitType == BRShowUnitTypeAll ? [self getDayUnit] : @"";
  471. dayString = [NSString stringWithFormat:@"%@%@", dayString, dayUnit];
  472. if (self.isShowWeek) {
  473. NSDate *date = [NSDate br_setYear:mSelectDate.br_year month:mSelectDate.br_month day:[dayString integerValue]];
  474. NSString *weekdayString = [NSBundle br_localizedStringForKey:[date br_weekdayString] language:self.pickerStyle.language];
  475. dayString = [NSString stringWithFormat:@"%@%@", dayString, weekdayString];
  476. }
  477. return dayString;
  478. }
  479. - (NSString *)getHourText:(NSArray *)hourArr row:(NSInteger)row {
  480. NSInteger index = 0;
  481. if (row >= 0) {
  482. index = MIN(row, hourArr.count - 1);
  483. }
  484. NSString *hourString = [hourArr objectAtIndex:index];
  485. if ((self.lastRowContent && [hourString isEqualToString:self.lastRowContent]) || (self.firstRowContent && [hourString isEqualToString:self.firstRowContent])) {
  486. return hourString;
  487. }
  488. NSString *hourUnit = self.showUnitType == BRShowUnitTypeAll ? [self getHourUnit] : @"";
  489. return [NSString stringWithFormat:@"%@%@", hourString, hourUnit];
  490. }
  491. - (NSString *)getMinuteText:(NSArray *)minuteArr row:(NSInteger)row {
  492. NSInteger index = 0;
  493. if (row >= 0) {
  494. index = MIN(row, minuteArr.count - 1);
  495. }
  496. NSString *minuteString = [minuteArr objectAtIndex:index];
  497. NSString *minuteUnit = self.showUnitType == BRShowUnitTypeAll ? [self getMinuteUnit] : @"";
  498. return [NSString stringWithFormat:@"%@%@", minuteString, minuteUnit];
  499. }
  500. - (NSString *)getSecondText:(NSArray *)secondArr row:(NSInteger)row {
  501. NSInteger index = 0;
  502. if (row >= 0) {
  503. index = MIN(row, secondArr.count - 1);
  504. }
  505. NSString *secondString = [secondArr objectAtIndex:index];
  506. NSString *secondUnit = self.showUnitType == BRShowUnitTypeAll ? [self getSecondUnit] : @"";
  507. return [NSString stringWithFormat:@"%@%@", secondString, secondUnit];
  508. }
  509. - (NSString *)getAMText {
  510. return [NSBundle br_localizedStringForKey:@"上午" language:self.pickerStyle.language];
  511. }
  512. - (NSString *)getPMText {
  513. return [NSBundle br_localizedStringForKey:@"下午" language:self.pickerStyle.language];
  514. }
  515. - (NSString *)getYearUnit {
  516. if (self.customUnit) {
  517. return self.customUnit[@"year"] ? : @"";
  518. }
  519. if (![self.pickerStyle.language hasPrefix:@"zh"]) {
  520. return @"";
  521. }
  522. return [NSBundle br_localizedStringForKey:@"年" language:self.pickerStyle.language];
  523. }
  524. - (NSString *)getMonthUnit {
  525. if (self.customUnit) {
  526. return self.customUnit[@"month"] ? : @"";
  527. }
  528. if (![self.pickerStyle.language hasPrefix:@"zh"]) {
  529. return @"";
  530. }
  531. return [NSBundle br_localizedStringForKey:@"月" language:self.pickerStyle.language];
  532. }
  533. - (NSString *)getDayUnit {
  534. if (self.customUnit) {
  535. return self.customUnit[@"day"] ? : @"";
  536. }
  537. if (![self.pickerStyle.language hasPrefix:@"zh"]) {
  538. return @"";
  539. }
  540. return [NSBundle br_localizedStringForKey:@"日" language:self.pickerStyle.language];
  541. }
  542. - (NSString *)getHourUnit {
  543. if (self.pickerMode == BRDatePickerModeYMDH && self.isShowAMAndPM) {
  544. return @"";
  545. }
  546. if (self.customUnit) {
  547. return self.customUnit[@"hour"] ? : @"";
  548. }
  549. if (![self.pickerStyle.language hasPrefix:@"zh"]) {
  550. return @"";
  551. }
  552. return [NSBundle br_localizedStringForKey:@"时" language:self.pickerStyle.language];
  553. }
  554. - (NSString *)getMinuteUnit {
  555. if (self.customUnit) {
  556. return self.customUnit[@"minute"] ? : @"";
  557. }
  558. if (![self.pickerStyle.language hasPrefix:@"zh"]) {
  559. return @"";
  560. }
  561. return [NSBundle br_localizedStringForKey:@"分" language:self.pickerStyle.language];
  562. }
  563. - (NSString *)getSecondUnit {
  564. if (self.customUnit) {
  565. return self.customUnit[@"second"] ? : @"";
  566. }
  567. if (![self.pickerStyle.language hasPrefix:@"zh"]) {
  568. return @"";
  569. }
  570. return [NSBundle br_localizedStringForKey:@"秒" language:self.pickerStyle.language];
  571. }
  572. - (NSInteger)getIndexWithArray:(NSArray *)array object:(NSString *)obj {
  573. if (!array || array.count == 0 || !obj) {
  574. return 0;
  575. }
  576. if ([array containsObject:obj]) {
  577. return [array indexOfObject:obj];
  578. }
  579. return 0;
  580. }
  581. @end