BRDatePickerView+BR.m 26 KB

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