猎豆优选

ITDatePickerController.m 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758
  1. //
  2. // ITDatePickerController.m
  3. // ITDatePickerControllerSampleCode
  4. //
  5. // Created by Wit on 2017/8/10.
  6. // Copyright © 2017年 Wit. All rights reserved.
  7. //
  8. #import "ITDatePickerController.h"
  9. #define kITScreenWidth ([[UIScreen mainScreen] bounds].size.width)
  10. #define kITScreenHeight ([[UIScreen mainScreen] bounds].size.height)
  11. static NSInteger kITDatePickerViewHeight = 216+44;
  12. #define kITLocalDate(date) \
  13. \
  14. NSTimeZone *zone = [NSTimeZone systemTimeZone];\
  15. NSInteger interval = [zone secondsFromGMTForDate:date];\
  16. date = [date dateByAddingTimeInterval:interval]
  17. #pragma mark - ***************** ITDatePickerController *************
  18. #pragma mark -
  19. @interface ITDatePickerController ()
  20. <UIViewControllerTransitioningDelegate,
  21. ITDatePickerControllerDelegate>
  22. @property (strong, nonatomic, readwrite) ITDatePickerView *datePickerView;
  23. @property (strong, nonatomic, readwrite) UIView *backgroundView;
  24. @end
  25. @implementation ITDatePickerController
  26. #pragma mark - init
  27. #pragma mark -
  28. - (instancetype)init
  29. {
  30. if (self = [super init]) {
  31. [self configDatePickerController];
  32. }
  33. return self;
  34. }
  35. - (void)awakeFromNib {
  36. [super awakeFromNib];
  37. [self configDatePickerController];
  38. }
  39. - (id)initWithCoder:(NSCoder *)aDecoder
  40. {
  41. if (self = [super initWithCoder:aDecoder]) {
  42. [self configDatePickerController];
  43. }
  44. return self;
  45. }
  46. - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
  47. {
  48. if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
  49. [self configDatePickerController];
  50. }
  51. return self;
  52. }
  53. #pragma mark - life cycle
  54. - (void)viewDidLoad {
  55. [super viewDidLoad];
  56. self.view.backgroundColor = [UIColor clearColor];
  57. [self.view insertSubview:self.backgroundView atIndex:0];
  58. [self.view addSubview:self.datePickerView];
  59. [self addSingleTapGestures];
  60. }
  61. #pragma mark - Public
  62. #pragma mark -
  63. - (void)refreshData {
  64. [self.datePickerView refreshData];
  65. }
  66. #pragma mark - IBActions
  67. #pragma mark -
  68. - (void)singleTap:(UITapGestureRecognizer *)sender {
  69. [self dismissViewControllerAnimated:YES completion:nil];
  70. }
  71. #pragma mark - Private
  72. #pragma mark -
  73. - (void)configDatePickerController {
  74. self.providesPresentationContextTransitionStyle = YES;
  75. self.definesPresentationContext = YES;
  76. self.modalPresentationStyle = UIModalPresentationCustom;
  77. self.transitioningDelegate = self;
  78. }
  79. - (void)addSingleTapGestures {
  80. UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
  81. [self.backgroundView addGestureRecognizer:singleTap];
  82. }
  83. #pragma mark - Delegate Collection
  84. #pragma mark - ITDatePickerControllerDelegate
  85. - (void)datePickerController:(ITDatePickerController *)datePickerController
  86. didSelectedDate:(NSDate *)date
  87. dateString:(NSString *)dateString {
  88. if ([self.delegate respondsToSelector:@selector(datePickerController:didSelectedDate:dateString:)]) {
  89. [self.delegate datePickerController:self didSelectedDate:date dateString:dateString];
  90. }
  91. }
  92. #pragma mark - UIViewControllerTransitioningDelegate
  93. - (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
  94. {
  95. return [ITAnimation animationWithPresenting:YES];
  96. }
  97. - (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
  98. {
  99. return [ITAnimation animationWithPresenting:NO];
  100. }
  101. #pragma mark - Custom Accessors
  102. #pragma mark -
  103. - (void)setShowToday:(BOOL)showToday {
  104. [self.datePickerView setShowToday:showToday];
  105. }
  106. - (void)setMaximumDate:(NSDate *)maximumDate {
  107. [self.datePickerView setMaximumDate:maximumDate];
  108. }
  109. - (void)setMinimumDate:(NSDate *)minimumDate {
  110. [self.datePickerView setMinimumDate:minimumDate];
  111. }
  112. - (void)setDefaultYear:(NSInteger)defaultYear {
  113. [self.datePickerView setDefaultYear:defaultYear];
  114. }
  115. - (void)setDefaultMonth:(NSInteger)defaultMonth {
  116. [self.datePickerView setDefaultMonth:defaultMonth];
  117. }
  118. - (void)setDefaultDate:(NSDate *)defaultDate {
  119. [self.datePickerView setDefaultDate:defaultDate];
  120. }
  121. - (void)setLeftItems:(NSArray *)leftItems {
  122. [self.datePickerView setLeftItems:leftItems];
  123. }
  124. - (void)setRightItems:(NSArray *)rightItems {
  125. [self.datePickerView setRightItems:rightItems];
  126. }
  127. - (ITDatePickerView *)datePickerView {
  128. if (!_datePickerView) {
  129. _datePickerView = [[ITDatePickerView alloc] initWithFrame:CGRectMake(0, kITScreenHeight-kITDatePickerViewHeight, kITScreenWidth, kITDatePickerViewHeight)];
  130. _datePickerView.delegate = self;
  131. }
  132. return _datePickerView;
  133. }
  134. - (UIView *)backgroundView {
  135. if (!_backgroundView) {
  136. _backgroundView = [[UIView alloc] initWithFrame:self.view.bounds];
  137. _backgroundView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.4];
  138. }
  139. return _backgroundView;
  140. }
  141. @end
  142. #pragma mark - ***************** ITAnimation *************
  143. #pragma mark -
  144. @implementation ITAnimation
  145. #pragma mark - Init
  146. #pragma mark -
  147. - (instancetype)initWithPresenting:(BOOL)isPresenting {
  148. self = [super init];
  149. if (self) {
  150. _presenting = isPresenting;
  151. }
  152. return self;
  153. }
  154. + (instancetype)animationWithPresenting:(BOOL)isPresenting {
  155. return [[ITAnimation alloc] initWithPresenting:isPresenting];
  156. }
  157. #pragma mark - Private
  158. #pragma mark -
  159. - (void)presentAnimateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
  160. {
  161. ITDatePickerController *toViewController = (ITDatePickerController *)[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
  162. toViewController.backgroundView.alpha = 0.0;
  163. toViewController.datePickerView.transform = CGAffineTransformMakeTranslation(0, CGRectGetHeight(toViewController.datePickerView.frame));
  164. UIView *containerView = [transitionContext containerView];
  165. [containerView addSubview:toViewController.view];
  166. [UIView animateWithDuration:0.25 animations:^{
  167. toViewController.backgroundView.alpha = 1.0;
  168. } completion:nil];
  169. [UIView animateWithDuration:0.25
  170. delay:0
  171. options:UIViewAnimationOptionCurveEaseOut
  172. animations:^{
  173. toViewController.datePickerView.transform = CGAffineTransformIdentity;
  174. } completion:^(BOOL finished) {
  175. [transitionContext completeTransition:YES];
  176. }];
  177. }
  178. - (void)dismissAnimateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
  179. {
  180. ITDatePickerController *fromViewController = (ITDatePickerController *)[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
  181. fromViewController.datePickerView.transform = CGAffineTransformIdentity;
  182. [UIView animateWithDuration:0.25 animations:^{
  183. fromViewController.backgroundView.alpha = 0.0;
  184. } completion:nil];
  185. [UIView animateWithDuration:0.25
  186. delay:0
  187. options:UIViewAnimationOptionCurveEaseIn
  188. animations:^{
  189. fromViewController.datePickerView.transform = CGAffineTransformMakeTranslation(0, CGRectGetHeight(fromViewController.datePickerView.frame));
  190. } completion:^(BOOL finished) {
  191. [transitionContext completeTransition:YES];
  192. }];
  193. }
  194. #pragma mark - UIViewControllerAnimatedTransitioning
  195. #pragma mark -
  196. - (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
  197. {
  198. if (self.isPresenting) {
  199. [self presentAnimateTransition:transitionContext];
  200. }else {
  201. [self dismissAnimateTransition:transitionContext];
  202. }
  203. }
  204. - (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
  205. {
  206. if (self.isPresenting) {
  207. return 0.45;
  208. }
  209. return 0.25;
  210. }
  211. @end
  212. #pragma mark - ***************** IDDatePickerView *************
  213. #pragma mark -
  214. static NSInteger maxCount = 1000;
  215. @interface ITDatePickerView ()
  216. <UIPickerViewDelegate,
  217. UIPickerViewDataSource>
  218. @property (nonatomic) NSInteger yearCount;
  219. @property (nonatomic) NSInteger monthCount;
  220. @property (nonatomic) NSInteger thisYear;
  221. @property (nonatomic) NSInteger thisMonth;
  222. @property (nonatomic) NSInteger thisDay;
  223. @property (nonatomic) NSInteger maximumYear;
  224. @property (nonatomic) NSInteger minimumYear;
  225. @property (nonatomic) NSInteger maximumMonth;
  226. @property (nonatomic) NSInteger minimumMonth;
  227. @property (nonatomic) NSInteger selectedYear;
  228. @property (nonatomic) NSInteger selectedMonth;
  229. @property (strong, nonatomic) NSDateFormatter *dateFormatter;
  230. @property (nonatomic, getter=isHideMonth) BOOL hideMonth;
  231. @property (strong, nonatomic) UIView *line;
  232. @property (strong, nonatomic) UIBarButtonItem *cancelButton;
  233. @property (strong, nonatomic) UIBarButtonItem *confirmButton;
  234. @property (strong, nonatomic, readwrite) UIBarButtonItem *flexibleSpaceItem;
  235. @property (strong, nonatomic, readwrite) UIView *toolBar;
  236. @property (strong, nonatomic) UIPickerView *pickerView;
  237. /**
  238. Cancel the operation
  239. */
  240. - (void)cancelButtonOnClicked:(UIButton *)sender;
  241. /**
  242. Confirm the operation
  243. */
  244. - (void)confirmButtonOnClicked:(UIButton *)sender;
  245. @end
  246. @implementation ITDatePickerView
  247. @synthesize yearCount = _yearCount;
  248. #pragma mark - Init
  249. #pragma mark -
  250. - (instancetype)init
  251. {
  252. self = [super init];
  253. if (self) {
  254. [self initDatePickerView];
  255. }
  256. return self;
  257. }
  258. - (instancetype)initWithFrame:(CGRect)frame
  259. {
  260. self = [super initWithFrame:frame];
  261. if (self) {
  262. [self initDatePickerView];
  263. }
  264. return self;
  265. }
  266. - (void)didMoveToSuperview {
  267. [super didMoveToSuperview];
  268. [self refreshData];
  269. }
  270. #pragma mark - Public
  271. #pragma mark -
  272. - (void)refreshData {
  273. if (self.showToday && self.selectedYear == self.thisYear && self.selectedYear == self.thisYear) {
  274. self.hideMonth = YES;
  275. } else {
  276. self.hideMonth = NO;
  277. }
  278. [self.pickerView reloadAllComponents];
  279. [self setDefaultYear:_defaultYear];
  280. [self setDefaultMonth:_defaultMonth];
  281. }
  282. #pragma mark - IBActions
  283. #pragma mark -
  284. - (void)cancelButtonOnClicked:(UIButton *)sender {
  285. [[self topVC] dismissViewControllerAnimated:YES completion:nil];
  286. }
  287. - (void)confirmButtonOnClicked:(UIButton *)sender {
  288. if ([self.delegate respondsToSelector:@selector(datePickerController:didSelectedDate:dateString:)]) {
  289. NSString *dateString = [NSString stringWithFormat:@"%ld-%02ld", self.selectedYear, self.selectedMonth];
  290. NSDate *selectedDate = [self.dateFormatter dateFromString:dateString];
  291. if (self.selectedYear == self.thisYear &&
  292. self.selectedMonth == self.thisMonth &&
  293. self.showToday) {
  294. dateString = @"至今";
  295. }
  296. kITLocalDate(selectedDate);
  297. [self.delegate datePickerController:(id)self didSelectedDate:selectedDate dateString:dateString];
  298. }
  299. [self cancelButtonOnClicked:nil];
  300. }
  301. #pragma mark - Private
  302. #pragma mark -
  303. - (void)initDatePickerView {
  304. [self initThisDate];
  305. NSCalendar *gregorian = [[NSCalendar alloc]
  306. initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
  307. // 获取当前日期
  308. NSDate* dt = [NSDate date];
  309. // 定义一个时间字段的旗标,指定将会获取指定年、月、日、时、分、秒的信息
  310. unsigned unitFlags = NSCalendarUnitYear |
  311. NSCalendarUnitMonth ;
  312. // 获取不同时间字段的信息
  313. NSDateComponents* comp = [gregorian components: unitFlags fromDate:dt];
  314. NSString *currentMonth =[NSString stringWithFormat:@"%ld-%ld",(long)comp.year,(long)comp.month];
  315. self.maximumDate = [self.dateFormatter dateFromString:currentMonth];
  316. self.minimumDate = [self.dateFormatter dateFromString:@"2018-01"];
  317. _showToday = YES;
  318. _monthCount = 12;
  319. self.defaultDate = [NSDate date];
  320. [self addSubview:self.toolBar];
  321. [self addSubview:self.pickerView];
  322. }
  323. - (void)initThisDate {
  324. NSDate *currentDate = [NSDate date];
  325. NSCalendar* calendar = [NSCalendar currentCalendar];
  326. NSDateComponents* components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:currentDate];
  327. _thisYear = [components year];
  328. _thisMonth = [components month];
  329. _thisDay = [components day];
  330. }
  331. - (UIViewController *)topVC {
  332. UIViewController *resultVC;
  333. resultVC = [self _topViewController:[[UIApplication sharedApplication].keyWindow rootViewController]];
  334. while (resultVC.presentedViewController) {
  335. resultVC = [self _topViewController:resultVC.presentedViewController];
  336. }
  337. return resultVC;
  338. }
  339. - (UIViewController *)_topViewController:(UIViewController *)vc {
  340. if ([vc isKindOfClass:[UINavigationController class]]) {
  341. return [self _topViewController:[(UINavigationController *)vc topViewController]];
  342. } else if ([vc isKindOfClass:[UITabBarController class]]) {
  343. return [self _topViewController:[(UITabBarController *)vc selectedViewController]];
  344. } else {
  345. return vc;
  346. }
  347. return nil;
  348. }
  349. - (void)resetToolbar{
  350. // NSMutableArray *items = [NSMutableArray array];
  351. // if (self.leftItems.count>0) {
  352. // [items addObjectsFromArray:self.leftItems];
  353. // }
  354. //
  355. // [items addObject:self.flexibleSpaceItem];
  356. //
  357. // if (self.rightItems.count>0) {
  358. // [items addObjectsFromArray:self.rightItems];
  359. // }
  360. //
  361. // [self.toolBar setItems:items];
  362. }
  363. #pragma mark - Delegate Collectioin
  364. #pragma mark - UIPickerViewDataSource
  365. - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
  366. return 2;
  367. }
  368. - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
  369. if (component == 0) {
  370. return _yearCount;
  371. }
  372. return maxCount;
  373. }
  374. #pragma mark - UIPickerViewDelegate
  375. - (nullable NSString *)pickerView:(UIPickerView *)pickerView
  376. titleForRow:(NSInteger)row forComponent:(NSInteger)component {
  377. if (component == 0) {
  378. NSInteger index = row % self.yearCount;
  379. NSString *text = [NSString stringWithFormat:@"%ld", self.minimumYear+index];
  380. if (self.isShowToday &&
  381. text.integerValue == self.thisYear &&
  382. self.selectedYear == self.thisYear &&
  383. self.selectedMonth == self.thisMonth) {
  384. text = @"至今";
  385. }
  386. return text;
  387. } else {
  388. NSInteger index = row % self.monthCount+1;
  389. if (self.isHideMonth &&
  390. index == self.thisMonth &&
  391. self.selectedMonth == self.thisMonth &&
  392. self.selectedYear == self.thisYear) {
  393. return @"--";
  394. }
  395. return [NSString stringWithFormat:@"%02ld", index];
  396. }
  397. }
  398. - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
  399. if (component == 0) {
  400. self.selectedYear = row%self.yearCount+self.minimumYear;
  401. if (row<maxCount/4 || row > maxCount/4*3) {
  402. [self setDefaultYear:self.selectedYear];
  403. }
  404. } else {
  405. self.selectedMonth = row%self.monthCount+1;
  406. if (row<maxCount/4 || row > maxCount/4*3) {
  407. [self setDefaultMonth:self.selectedMonth];
  408. }
  409. }
  410. if (self.selectedYear == self.maximumYear &&
  411. self.selectedMonth > self.maximumMonth) {
  412. self.defaultMonth = self.maximumMonth;
  413. }
  414. if (self.selectedYear == self.minimumYear &&
  415. self.selectedMonth < self.minimumMonth) {
  416. self.defaultMonth = self.minimumMonth;
  417. }
  418. if (self.isShowToday) {
  419. if ((self.selectedYear != self.thisYear &&
  420. self.selectedMonth == self.thisMonth) ||
  421. (self.selectedYear == self.thisYear &&
  422. self.selectedMonth != self.thisMonth)) {
  423. self.hideMonth = NO;
  424. [self.pickerView reloadAllComponents];
  425. }
  426. if ( self.selectedYear == self.thisYear &&
  427. self.selectedMonth == self.thisMonth) {
  428. self.hideMonth = YES;
  429. [self.pickerView reloadAllComponents];
  430. }
  431. }
  432. }
  433. #pragma mark - Custom Accessors
  434. #pragma mark -
  435. - (void)setDefaultYear:(NSInteger)defaultYear {
  436. if (defaultYear> self.maximumYear) {
  437. _defaultYear = self.maximumYear;
  438. } else if (defaultYear < self.minimumYear) {
  439. _defaultYear = self.minimumYear;
  440. } else {
  441. _defaultYear = defaultYear;
  442. }
  443. NSInteger selctRow = self.defaultYear- self.minimumYear;
  444. self.selectedYear = defaultYear;
  445. [self.pickerView reloadComponent:0];
  446. [self.pickerView selectRow:selctRow inComponent:0 animated:NO];
  447. }
  448. - (void)setDefaultMonth:(NSInteger)defaultMonth {
  449. if (defaultMonth> 12) {
  450. _defaultMonth = 12;
  451. } else if (defaultMonth < 1) {
  452. _defaultYear = 1;
  453. } else {
  454. _defaultMonth = defaultMonth;
  455. }
  456. _defaultMonth = defaultMonth;
  457. NSInteger selectRow = (maxCount/2)/self.monthCount*self.monthCount+ self.defaultMonth-1;
  458. self.selectedMonth = defaultMonth;
  459. [self.pickerView reloadComponent:1];
  460. [self.pickerView selectRow:selectRow inComponent:1 animated:NO];
  461. }
  462. - (void)setShowToday:(BOOL)showToday {
  463. _showToday = showToday;
  464. }
  465. - (void)setMinimumYear:(NSInteger)minimumYear {
  466. _minimumYear = minimumYear;
  467. self.yearCount = _maximumYear - _minimumYear+1;
  468. }
  469. - (void)setMaximumYear:(NSInteger)maximumYear {
  470. _maximumYear = maximumYear;
  471. self.yearCount = _maximumYear - _minimumYear+1;
  472. }
  473. - (void)setYearCount:(NSInteger)yearCount {
  474. _yearCount = yearCount;
  475. }
  476. - (NSInteger)yearCount {
  477. return _yearCount;
  478. }
  479. - (void)setMaximumDate:(NSDate *)maximumDate {
  480. if (maximumDate == nil) {
  481. maximumDate = [self.dateFormatter dateFromString:@"2019-12"];
  482. }
  483. _maximumDate = [maximumDate copy];
  484. kITLocalDate(_maximumDate);
  485. NSCalendar* calendar = [NSCalendar currentCalendar];
  486. NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth fromDate:_maximumDate];
  487. self.maximumYear = [components year];
  488. self.maximumMonth = [components month];
  489. }
  490. - (void)setMinimumDate:(NSDate *)minimumDate {
  491. if (minimumDate == nil) {
  492. minimumDate = [self.dateFormatter dateFromString:@"2018-01"];
  493. }
  494. _minimumDate = [minimumDate copy];
  495. kITLocalDate(_minimumDate);
  496. NSCalendar* calendar = [NSCalendar currentCalendar];
  497. NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth fromDate:_minimumDate];
  498. self.minimumYear = [components year];
  499. self.minimumMonth = [components month];
  500. }
  501. - (void)setDefaultDate:(NSDate *)defaultDate {
  502. if (defaultDate == nil) {
  503. defaultDate = [NSDate date];
  504. }
  505. _defaultDate = [defaultDate copy];
  506. NSCalendar* calendar = [NSCalendar currentCalendar];
  507. NSDateComponents* components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth fromDate:_defaultDate];
  508. NSInteger year = [components year];
  509. NSInteger month = [components month];
  510. [self setDefaultYear:year];
  511. [self setDefaultMonth:month];
  512. }
  513. - (void)setLeftItems:(NSArray *)leftItems {
  514. _leftItems = [leftItems copy];
  515. [self resetToolbar];
  516. }
  517. - (void)setRightItems:(NSArray *)rightItems {
  518. _rightItems = rightItems;
  519. [self resetToolbar];
  520. }
  521. - (NSDateFormatter *)dateFormatter {
  522. if (!_dateFormatter) {
  523. _dateFormatter = [[NSDateFormatter alloc] init];
  524. _dateFormatter.dateFormat = @"yyyy-MM";
  525. }
  526. return _dateFormatter;
  527. }
  528. - (UIBarButtonItem *)cancelButton {
  529. if (!_cancelButton) {
  530. _cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelButtonOnClicked:)];
  531. }
  532. return _cancelButton;
  533. }
  534. - (UIBarButtonItem *)flexibleSpaceItem {
  535. if (!_flexibleSpaceItem) {
  536. _flexibleSpaceItem =
  537. [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
  538. target:self
  539. action:nil];
  540. }
  541. return _flexibleSpaceItem;
  542. }
  543. - (UIBarButtonItem *)confirmButton {
  544. if (!_confirmButton) {
  545. _confirmButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(confirmButtonOnClicked:)];
  546. }
  547. return _confirmButton;
  548. }
  549. - (UIView *)line {
  550. if (!_line) {
  551. _line = [[UIView alloc] initWithFrame:CGRectMake(0, 39.5, kITScreenWidth, 0.5)];
  552. _line.backgroundColor = [UIColor colorWithRed:234/255.0 green:234/255.0 blue:234/255.0 alpha:1];
  553. }
  554. return _line;
  555. }
  556. - (UIView *)toolBar {
  557. if (!_toolBar) {
  558. _toolBar = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kITScreenWidth, 44)];
  559. // _toolBar.translucent = NO;
  560. _toolBar.backgroundColor = [UIColor homeRedColor];
  561. self.leftItems = @[self.cancelButton];
  562. self.rightItems = @[self.confirmButton];
  563. // [self resetToolbar];
  564. UIButton *left = [[UIButton alloc] initWithFrame:CGRectMake(5, 0, 44, 44)];
  565. [left setTitle:@"取消" forState:UIControlStateNormal];
  566. left.titleLabel.font = [UIFont systemFontOfSize:15];
  567. [left setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  568. [left addTarget:self action:@selector(cancelButtonOnClicked:) forControlEvents:UIControlEventTouchUpInside];
  569. [_toolBar addSubview:left];
  570. UIButton *right = [[UIButton alloc] initWithFrame:CGRectMake(kITScreenWidth-5-44, 0, 44, 44)];
  571. [right setTitle:@"确定" forState:UIControlStateNormal];
  572. right.titleLabel.font = [UIFont systemFontOfSize:15];
  573. [right setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  574. [right addTarget:self action:@selector(confirmButtonOnClicked:) forControlEvents:UIControlEventTouchUpInside];
  575. [_toolBar addSubview:right];
  576. UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 44)];
  577. title.font = [UIFont systemFontOfSize:15];
  578. title.textColor = [UIColor whiteColor];
  579. title.textAlignment = NSTextAlignmentCenter;
  580. title.text = @"选择月份";
  581. title.centerX = _toolBar.centerX;
  582. [_toolBar addSubview:title];
  583. // [_toolBar addSubview:self.line];
  584. }
  585. return _toolBar;
  586. }
  587. - (UIPickerView *)pickerView {
  588. if (!_pickerView) {
  589. _pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 44, kITScreenWidth, 216)];
  590. _pickerView.backgroundColor = [UIColor whiteColor];
  591. _pickerView.delegate = self;
  592. _pickerView.dataSource = self;
  593. }
  594. return _pickerView;
  595. }
  596. @end