CCDatePickerView.m 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154
  1. //
  2. // CCDatePickerView.m
  3. // ChooseTimePickerView
  4. //
  5. // Created by 陈红 on 2017/3/12.
  6. // Copyright © 2017年 陈红:ch_email@126.cm. All rights reserved.
  7. //
  8. #import "CCDatePickerView.h"
  9. #define ScreenWidth [UIScreen mainScreen].bounds.size.width
  10. #define ScreenHeight [UIScreen mainScreen].bounds.size.height
  11. #define H(height) ScreenHeight*(height)/1136
  12. #define W(width) ScreenWidth*(width)/640
  13. #define Width 640
  14. #define Height 1136
  15. #define kPickerSize self.datePicker.frame.size
  16. #define RGBA(r, g, b, a) ([UIColor colorWithRed:(r / 255.0) green:(g / 255.0) blue:(b / 255.0) alpha:a])
  17. #define MAXYEAR 2050
  18. #define MINYEAR 1970
  19. @interface CCDatePickerView ()
  20. {
  21. //日期存储数组
  22. NSMutableArray *_yearArray;
  23. NSMutableArray *_monthArray;
  24. NSMutableArray *_dayArray;
  25. NSMutableArray *_hourArray;
  26. NSMutableArray *_minuteArray;
  27. //记录日期位置
  28. NSInteger yearIndex;
  29. NSInteger monthIndex;
  30. NSInteger dayIndex;
  31. NSInteger hourIndex;
  32. NSInteger minuteIndex;
  33. //记录选择日期
  34. NSDate *_startDate;
  35. }
  36. @property(nonatomic,strong)UIView *contentView;
  37. @property(nonatomic,strong)UIView *dateView;
  38. @property(nonatomic,strong)UILabel *yearLabel;
  39. @property(nonatomic,strong)UILabel *monthLabel;
  40. @property(nonatomic,strong)UILabel *dayLabel;
  41. @property(nonatomic,strong)UILabel *startHourLabel;
  42. @property(nonatomic,strong)UILabel *endLabel;
  43. @property(nonatomic,strong)UIView *line1;
  44. @property(nonatomic,strong)UIView *line2;
  45. @property(nonatomic,strong)UIView *line3;
  46. @property(nonatomic,strong)UIView *line4;
  47. @property (nonatomic, copy)NSString *dateFormatter;//设置日期格式
  48. @property (nonatomic, retain)NSDate *scrollToDate;//滚到指定日期
  49. @end
  50. @implementation CCDatePickerView
  51. - (instancetype)initWithFrame:(CGRect)frame{
  52. self=[super initWithFrame:frame];
  53. if (self) {
  54. _dateFormatter = @"yyyy-MM-dd HH:mm";
  55. [self setupUI];
  56. [self defaultConfig];
  57. [self getNowDate:nil animated:NO];//当前时间
  58. }
  59. return self;
  60. }
  61. -(void)setupUI
  62. {
  63. UIView *contentView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
  64. contentView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.3];
  65. [self addSubview:contentView];
  66. self.contentView = contentView;
  67. self.dateView=[[UIView alloc] initWithFrame:CGRectMake(W(30), 64+50, ScreenWidth-W(60), H(550))];
  68. self.dateView.backgroundColor=[UIColor whiteColor];
  69. self.dateView.layer.cornerRadius=8;
  70. [self.dateView.layer setMasksToBounds:YES];
  71. [contentView addSubview:self.dateView];
  72. self.dateView.userInteractionEnabled=YES;
  73. self.chooseTimeLabel=[[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.dateView.size.width, H(80))];
  74. self.chooseTimeLabel.text=@"请选择服务时间";
  75. self.chooseTimeLabel.textColor=[UIColor grayColor];
  76. self.chooseTimeLabel.font=[UIFont systemFontOfSize:16];
  77. self.chooseTimeLabel.textAlignment=NSTextAlignmentCenter;
  78. [self.dateView addSubview:self.chooseTimeLabel];
  79. self.line1=[[UIView alloc] initWithFrame:CGRectMake(0, self.chooseTimeLabel.bottom, self.dateView.size.width, 1)];
  80. self.line1.backgroundColor= RGBA(237, 237, 237, 1.0);
  81. [self.dateView addSubview:self.line1];
  82. [self addLabelTextWithName:@[@"年",@"月",@"日",@"始",@"束"]];
  83. self.line2=[[UIView alloc] initWithFrame:CGRectMake(0, self.yearLabel.bottom, self.dateView.size.width, 1)];
  84. self.line2.backgroundColor=RGBA(237, 237, 237, 1.0);
  85. [self.dateView addSubview:self.line2];
  86. self.line3=[[UIView alloc] initWithFrame:CGRectMake(self.dateView.size.width*4/7, self.line1.bottom, 1, self.dateView.size.height-H(160))];
  87. self.line3.backgroundColor=RGBA(237, 237, 237, 1.0);
  88. [self.dateView addSubview:self.line3];
  89. self.line4=[[UIView alloc] initWithFrame:CGRectMake(0, self.line3.bottom, self.dateView.size.width, 1)];
  90. self.line4.backgroundColor=RGBA(237, 237, 237, 1.0);
  91. [self.dateView addSubview:self.line4];
  92. self.cancelButton=[UIButton buttonWithType:UIButtonTypeSystem];
  93. [self.cancelButton setTitle:@"取消" forState:UIControlStateNormal];
  94. [self.cancelButton setTintColor:[UIColor grayColor]];
  95. self.cancelButton.titleLabel.font=[UIFont systemFontOfSize:14];
  96. self.cancelButton.frame=CGRectMake(0, self.line4.bottom, self.dateView.size.width*4/7, H(80));
  97. self.cancelButton.tag = 100;
  98. [self.cancelButton addTarget:self action:@selector(selectButton:) forControlEvents:UIControlEventTouchUpInside];
  99. [self.dateView addSubview:self.cancelButton];
  100. self.okButton=[UIButton buttonWithType:UIButtonTypeSystem];
  101. [self.okButton setTitle:@"确定" forState:UIControlStateNormal];
  102. [self.okButton setTintColor:RGBA(210, 55, 61, 1.0)];
  103. self.okButton.titleLabel.font=[UIFont systemFontOfSize:14];
  104. self.okButton.frame=CGRectMake(self.cancelButton.right, self.line4.bottom, self.dateView.size.width*3/7, H(80));
  105. [self.dateView addSubview:self.okButton];
  106. self.okButton.tag = 101;
  107. [self.okButton addTarget:self action:@selector(selectButton:) forControlEvents:UIControlEventTouchUpInside];
  108. [self.dateView addSubview:self.datePicker];
  109. }
  110. -(void)defaultConfig {
  111. if (!_scrollToDate) {
  112. _scrollToDate = [NSDate date];
  113. }
  114. //设置年月日时分数据
  115. _yearArray = [self setArray:_yearArray];
  116. _monthArray = [self setArray:_monthArray];
  117. _dayArray = [self setArray:_dayArray];
  118. _hourArray = [self setArray:_hourArray];
  119. _minuteArray = [self setArray:_minuteArray];
  120. for (int i=0; i<24; i++) {
  121. NSString *num = [NSString stringWithFormat:@"%02d",i];
  122. if (0<i && i<=12)
  123. [_monthArray addObject:num];
  124. if (i<24)
  125. [_hourArray addObject:num];
  126. }
  127. for (int i = 0; i < 60; i ++) {
  128. NSString *num = [NSString stringWithFormat:@"%02d",i];
  129. [_minuteArray addObject:num];
  130. }
  131. for (NSInteger i=MINYEAR; i<MAXYEAR; i++) {
  132. NSString *num = [NSString stringWithFormat:@"%ld",(long)i];
  133. [_yearArray addObject:num];
  134. }
  135. }
  136. /**
  137. 设置标识线
  138. @param nameArr 标识线数量
  139. */
  140. -(void)addLabelWithName:(NSArray *)nameArr {
  141. for (int i=0; i<nameArr.count; i++) {
  142. CGFloat labelX;
  143. if (i<3) {
  144. labelX= (self.dateView.size.width/7)*(i+1) + 5*i;
  145. }else{
  146. labelX=(self.dateView.size.width/7)*(i+2) - 10*i;
  147. if (i == 4) {
  148. labelX=(self.dateView.size.width/7)*(i+2) - 20;
  149. }
  150. }
  151. UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(labelX+W(40), self.dateView.frame.size.height/2-15/2.0+20, 15, 15)];
  152. label.text = nameArr[i];
  153. label.textAlignment = NSTextAlignmentCenter;
  154. label.font = [UIFont systemFontOfSize:12];
  155. label.textColor = [UIColor grayColor];
  156. label.backgroundColor = [UIColor clearColor];
  157. [self.dateView addSubview:label];
  158. CGFloat lineW;
  159. if (i<1) {
  160. lineW=W(60);
  161. }else{
  162. lineW=W(50);
  163. }
  164. UIView *line=[[UIView alloc] initWithFrame:CGRectMake(label.left-lineW, label.bottom, lineW, 1)];
  165. line.backgroundColor=RGBA(210, 55, 61, 1.0);
  166. [self.dateView addSubview:line];
  167. }
  168. }
  169. /**
  170. 设置标识文字
  171. @param nameArray 标识文字数量
  172. */
  173. - (void)addLabelTextWithName:(NSArray *)nameArray{
  174. for (int i = 0; i < nameArray.count; i ++) {
  175. UILabel *label=[[UILabel alloc] initWithFrame:CGRectMake(self.dateView.size.width*(i+1)/7+9*i, self.line1.bottom, W(40), H(60))];
  176. label.text= nameArray[i];
  177. label.tag = 1000 + i;
  178. label.textColor=RGBA(210, 55, 61, 1.0);
  179. label.font=[UIFont systemFontOfSize:16];
  180. [self.dateView addSubview:label];
  181. }
  182. self.yearLabel = [self viewWithTag:1000];
  183. }
  184. - (NSMutableArray *)setArray:(id)mutableArray
  185. {
  186. if (mutableArray)
  187. [mutableArray removeAllObjects];
  188. else
  189. mutableArray = [NSMutableArray array];
  190. return mutableArray;
  191. }
  192. - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
  193. {
  194. [self addLabelWithName:@[@"",@"",@"",@"时",@"分"]];
  195. return 5;
  196. }
  197. - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
  198. NSInteger yearNum = _yearArray.count;
  199. NSInteger monthNum = _monthArray.count;
  200. NSInteger dayNum = [self DaysfromYear:[_yearArray[yearIndex] integerValue] andMonth:[_monthArray[monthIndex] integerValue]];
  201. NSInteger hourNum = _hourArray.count;
  202. NSInteger minuteNUm = _minuteArray.count;
  203. NSArray *numberArr = @[@(yearNum),@(monthNum),@(dayNum),@(hourNum),@(minuteNUm)];
  204. return [numberArr[component] integerValue];
  205. }
  206. -(CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component {
  207. return 40;
  208. }
  209. -(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
  210. UILabel *customLabel = (UILabel *)view;
  211. if (!customLabel) {
  212. customLabel = [[UILabel alloc] init];
  213. customLabel.textAlignment = NSTextAlignmentCenter;
  214. [customLabel setFont:[UIFont systemFontOfSize:17]];
  215. }
  216. NSString *title;
  217. if (component==0) {
  218. title = _yearArray[row];
  219. }
  220. if (component==1) {
  221. title = _monthArray[row];
  222. }
  223. if (component==2) {
  224. title = _dayArray[row];
  225. }
  226. if (component==3) {
  227. title = _hourArray[row];
  228. }
  229. if (component==4) {
  230. title = _minuteArray[row];
  231. }
  232. customLabel.text = title;
  233. customLabel.textColor = [UIColor blackColor];
  234. // 设置横线的颜色,实现显示或者隐藏
  235. ((UILabel *)[pickerView.subviews objectAtIndex:1]).backgroundColor = [UIColor clearColor];
  236. ((UILabel *)[pickerView.subviews objectAtIndex:2]).backgroundColor = [UIColor clearColor];
  237. return customLabel;
  238. }
  239. - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
  240. {
  241. if (component == 0) {
  242. yearIndex = row;
  243. }
  244. if (component == 1) {
  245. monthIndex = row;
  246. }
  247. if (component == 2) {
  248. dayIndex = row;
  249. }
  250. if (component == 3) {
  251. hourIndex = row;
  252. }
  253. if (component == 4) {
  254. minuteIndex = row;
  255. }
  256. if (component == 0 || component == 1){
  257. [self DaysfromYear:[_yearArray[yearIndex] integerValue] andMonth:[_monthArray[monthIndex] integerValue]];
  258. if (_dayArray.count-1<dayIndex) {
  259. dayIndex = _dayArray.count-1;
  260. }
  261. }
  262. [pickerView reloadAllComponents];
  263. NSString *dateStr = [NSString stringWithFormat:@"%@-%@-%@ %@:%@",_yearArray[yearIndex],_monthArray[monthIndex],_dayArray[dayIndex],_hourArray[hourIndex],_minuteArray[minuteIndex]];
  264. self.scrollToDate = [NSDate date:dateStr WithFormat:@"yyyy-MM-dd HH:mm"] ;
  265. _startDate = self.scrollToDate;
  266. }
  267. /**
  268. 计算每个月的天数
  269. @param year 年份
  270. @param month 月份
  271. @return 返回天数
  272. */
  273. - (NSInteger)DaysfromYear:(NSInteger)year andMonth:(NSInteger)month
  274. {
  275. NSInteger num_year = year;
  276. NSInteger num_month = month;
  277. //判断是否是闰年 整除以4、100、400 则为闰年
  278. BOOL isrunNian = num_year%4==0 ? (num_year%100==0? (num_year%400==0?YES:NO):YES):NO;
  279. switch (num_month) {
  280. case 1:case 3:case 5:case 7:case 8:case 10:case 12:{
  281. [self setdayArray:31];
  282. return 31;
  283. }
  284. case 4:case 6:case 9:case 11:{
  285. [self setdayArray:30];
  286. return 30;
  287. }
  288. case 2:{
  289. if (isrunNian) {
  290. [self setdayArray:29];
  291. return 29;
  292. }else{
  293. [self setdayArray:28];
  294. return 28;
  295. }
  296. }
  297. default:
  298. break;
  299. }
  300. return 0;
  301. }
  302. //设置每月的天数数组
  303. - (void)setdayArray:(NSInteger)num
  304. {
  305. [_dayArray removeAllObjects];
  306. for (int i=1; i<=num; i++) {
  307. [_dayArray addObject:[NSString stringWithFormat:@"%02d",i]];
  308. }
  309. }
  310. //滚动到指定的时间位置
  311. - (void)getNowDate:(NSDate *)date animated:(BOOL)animated
  312. {
  313. //date 日期为空 怎是当前日期
  314. if (!date) {
  315. date = [NSDate date];
  316. }
  317. [self DaysfromYear:date.year andMonth:date.month];
  318. yearIndex = date.year-MINYEAR;
  319. monthIndex = date.month-1;
  320. dayIndex = date.day-1;
  321. hourIndex = date.hour;
  322. minuteIndex = date.minute;
  323. NSArray *indexArray;
  324. indexArray = @[@(yearIndex),@(monthIndex),@(dayIndex),@(hourIndex),@(minuteIndex)];
  325. [self.datePicker reloadAllComponents];
  326. for (int i=0; i<indexArray.count; i++) {
  327. [self.datePicker selectRow:[indexArray[i] integerValue] inComponent:i animated:animated];
  328. if (i == 4) {
  329. [self.datePicker selectRow:date.minute inComponent:4 animated:YES];
  330. }
  331. }
  332. _startDate = self.scrollToDate;
  333. }
  334. /**
  335. 时间控件选择器
  336. @return 返回时间控件选择器
  337. */
  338. -(UIPickerView *)datePicker {
  339. if (!_datePicker) {
  340. _datePicker = [[UIPickerView alloc] initWithFrame:CGRectMake(W(50), self.yearLabel.bottom-20, self.dateView.size.width-W(100), self.dateView.size.height-H(170))];
  341. _datePicker.showsSelectionIndicator = NO;
  342. _datePicker.showsSelectionIndicator = YES;
  343. _datePicker.delegate = self;
  344. _datePicker.dataSource = self;
  345. }
  346. return _datePicker;
  347. }
  348. - (void)fadeIn{
  349. self.alpha = 0;
  350. [UIView animateWithDuration:.35 animations:^{
  351. self.alpha = 1;
  352. }];
  353. }
  354. - (void)fadeOut{
  355. [UIView animateWithDuration:.35 animations:^{
  356. self.alpha = 0.0;
  357. }completion:^(BOOL finished) {
  358. if (finished){
  359. [self removeFromSuperview];
  360. }
  361. }];
  362. }
  363. -(void)selectButton:(UIButton *)sender
  364. {
  365. [self fadeOut];
  366. if (sender.tag == 101) {
  367. self.blcok(_startDate);
  368. }
  369. }
  370. - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
  371. [self fadeOut];
  372. }
  373. @end
  374. static const unsigned componentFlags = (NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekOfMonth | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday | NSCalendarUnitWeekdayOrdinal);
  375. @implementation NSDate (Extension)
  376. // Courtesy of Lukasz Margielewski
  377. // Updated via Holger Haenisch
  378. + (NSCalendar *) currentCalendar
  379. {
  380. static NSCalendar *sharedCalendar = nil;
  381. if (!sharedCalendar)
  382. sharedCalendar = [NSCalendar autoupdatingCurrentCalendar];
  383. return sharedCalendar;
  384. }
  385. #pragma mark - Relative Dates
  386. + (NSDate *) dateWithDaysFromNow: (NSInteger) days
  387. {
  388. // Thanks, Jim Morrison
  389. return [[NSDate date] dateByAddingDays:days];
  390. }
  391. + (NSDate *) dateWithDaysBeforeNow: (NSInteger) days
  392. {
  393. // Thanks, Jim Morrison
  394. return [[NSDate date] dateBySubtractingDays:days];
  395. }
  396. + (NSDate *) dateTomorrow
  397. {
  398. return [NSDate dateWithDaysFromNow:1];
  399. }
  400. + (NSDate *) dateYesterday
  401. {
  402. return [NSDate dateWithDaysBeforeNow:1];
  403. }
  404. + (NSDate *) dateWithHoursFromNow: (NSInteger) dHours
  405. {
  406. NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] + D_HOUR * dHours;
  407. NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval];
  408. return newDate;
  409. }
  410. + (NSDate *) dateWithHoursBeforeNow: (NSInteger) dHours
  411. {
  412. NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] - D_HOUR * dHours;
  413. NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval];
  414. return newDate;
  415. }
  416. + (NSDate *) dateWithMinutesFromNow: (NSInteger) dMinutes
  417. {
  418. NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] + D_MINUTE * dMinutes;
  419. NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval];
  420. return newDate;
  421. }
  422. + (NSDate *) dateWithMinutesBeforeNow: (NSInteger) dMinutes
  423. {
  424. NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] - D_MINUTE * dMinutes;
  425. NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval];
  426. return newDate;
  427. }
  428. #pragma mark - String Properties
  429. - (NSString *) stringWithFormat: (NSString *) format
  430. {
  431. NSDateFormatter *formatter = [NSDateFormatter new];
  432. // formatter.locale = [NSLocale currentLocale]; // Necessary?
  433. formatter.dateFormat = format;
  434. return [formatter stringFromDate:self];
  435. }
  436. - (NSString *) stringWithDateStyle: (NSDateFormatterStyle) dateStyle timeStyle: (NSDateFormatterStyle) timeStyle
  437. {
  438. NSDateFormatter *formatter = [NSDateFormatter new];
  439. formatter.dateStyle = dateStyle;
  440. formatter.timeStyle = timeStyle;
  441. // formatter.locale = [NSLocale currentLocale]; // Necessary?
  442. return [formatter stringFromDate:self];
  443. }
  444. - (NSString *) shortString
  445. {
  446. return [self stringWithDateStyle:NSDateFormatterShortStyle timeStyle:NSDateFormatterShortStyle];
  447. }
  448. - (NSString *) shortTimeString
  449. {
  450. return [self stringWithDateStyle:NSDateFormatterNoStyle timeStyle:NSDateFormatterShortStyle];
  451. }
  452. - (NSString *) shortDateString
  453. {
  454. return [self stringWithDateStyle:NSDateFormatterShortStyle timeStyle:NSDateFormatterNoStyle];
  455. }
  456. - (NSString *) mediumString
  457. {
  458. return [self stringWithDateStyle:NSDateFormatterMediumStyle timeStyle:NSDateFormatterMediumStyle ];
  459. }
  460. - (NSString *) mediumTimeString
  461. {
  462. return [self stringWithDateStyle:NSDateFormatterNoStyle timeStyle:NSDateFormatterMediumStyle ];
  463. }
  464. - (NSString *) mediumDateString
  465. {
  466. return [self stringWithDateStyle:NSDateFormatterMediumStyle timeStyle:NSDateFormatterNoStyle];
  467. }
  468. - (NSString *) longString
  469. {
  470. return [self stringWithDateStyle:NSDateFormatterLongStyle timeStyle:NSDateFormatterLongStyle ];
  471. }
  472. - (NSString *) longTimeString
  473. {
  474. return [self stringWithDateStyle:NSDateFormatterNoStyle timeStyle:NSDateFormatterLongStyle ];
  475. }
  476. - (NSString *) longDateString
  477. {
  478. return [self stringWithDateStyle:NSDateFormatterLongStyle timeStyle:NSDateFormatterNoStyle];
  479. }
  480. #pragma mark - Comparing Dates
  481. - (BOOL) isEqualToDateIgnoringTime: (NSDate *) aDate
  482. {
  483. NSDateComponents *components1 = [[NSDate currentCalendar] components:componentFlags fromDate:self];
  484. NSDateComponents *components2 = [[NSDate currentCalendar] components:componentFlags fromDate:aDate];
  485. return ((components1.year == components2.year) &&
  486. (components1.month == components2.month) &&
  487. (components1.day == components2.day));
  488. }
  489. - (BOOL) isToday
  490. {
  491. return [self isEqualToDateIgnoringTime:[NSDate date]];
  492. }
  493. - (BOOL) isTomorrow
  494. {
  495. return [self isEqualToDateIgnoringTime:[NSDate dateTomorrow]];
  496. }
  497. - (BOOL) isYesterday
  498. {
  499. return [self isEqualToDateIgnoringTime:[NSDate dateYesterday]];
  500. }
  501. // This hard codes the assumption that a week is 7 days
  502. - (BOOL) isSameWeekAsDate: (NSDate *) aDate
  503. {
  504. NSDateComponents *components1 = [[NSDate currentCalendar] components:componentFlags fromDate:self];
  505. NSDateComponents *components2 = [[NSDate currentCalendar] components:componentFlags fromDate:aDate];
  506. // Must be same week. 12/31 and 1/1 will both be week "1" if they are in the same week
  507. if (components1.weekOfMonth != components2.weekOfMonth) return NO;
  508. // Must have a time interval under 1 week. Thanks @aclark
  509. return (fabs([self timeIntervalSinceDate:aDate]) < D_WEEK);
  510. }
  511. - (BOOL) isThisWeek
  512. {
  513. return [self isSameWeekAsDate:[NSDate date]];
  514. }
  515. - (BOOL) isNextWeek
  516. {
  517. NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] + D_WEEK;
  518. NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval];
  519. return [self isSameWeekAsDate:newDate];
  520. }
  521. - (BOOL) isLastWeek
  522. {
  523. NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] - D_WEEK;
  524. NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval];
  525. return [self isSameWeekAsDate:newDate];
  526. }
  527. // Thanks, mspasov
  528. - (BOOL) isSameMonthAsDate: (NSDate *) aDate
  529. {
  530. NSDateComponents *components1 = [[NSDate currentCalendar] components:NSCalendarUnitYear | NSCalendarUnitMonth fromDate:self];
  531. NSDateComponents *components2 = [[NSDate currentCalendar] components:NSCalendarUnitYear | NSCalendarUnitMonth fromDate:aDate];
  532. return ((components1.month == components2.month) &&
  533. (components1.year == components2.year));
  534. }
  535. - (BOOL) isThisMonth
  536. {
  537. return [self isSameMonthAsDate:[NSDate date]];
  538. }
  539. // Thanks Marcin Krzyzanowski, also for adding/subtracting years and months
  540. - (BOOL) isLastMonth
  541. {
  542. return [self isSameMonthAsDate:[[NSDate date] dateBySubtractingMonths:1]];
  543. }
  544. - (BOOL) isNextMonth
  545. {
  546. return [self isSameMonthAsDate:[[NSDate date] dateByAddingMonths:1]];
  547. }
  548. - (BOOL) isSameYearAsDate: (NSDate *) aDate
  549. {
  550. NSDateComponents *components1 = [[NSDate currentCalendar] components:NSCalendarUnitYear fromDate:self];
  551. NSDateComponents *components2 = [[NSDate currentCalendar] components:NSCalendarUnitYear fromDate:aDate];
  552. return (components1.year == components2.year);
  553. }
  554. - (BOOL) isThisYear
  555. {
  556. // Thanks, baspellis
  557. return [self isSameYearAsDate:[NSDate date]];
  558. }
  559. - (BOOL) isNextYear
  560. {
  561. NSDateComponents *components1 = [[NSDate currentCalendar] components:NSCalendarUnitYear fromDate:self];
  562. NSDateComponents *components2 = [[NSDate currentCalendar] components:NSCalendarUnitYear fromDate:[NSDate date]];
  563. return (components1.year == (components2.year + 1));
  564. }
  565. - (BOOL) isLastYear
  566. {
  567. NSDateComponents *components1 = [[NSDate currentCalendar] components:NSCalendarUnitYear fromDate:self];
  568. NSDateComponents *components2 = [[NSDate currentCalendar] components:NSCalendarUnitYear fromDate:[NSDate date]];
  569. return (components1.year == (components2.year - 1));
  570. }
  571. - (BOOL) isEarlierThanDate: (NSDate *) aDate
  572. {
  573. return ([self compare:aDate] == NSOrderedAscending);
  574. }
  575. - (BOOL) isLaterThanDate: (NSDate *) aDate
  576. {
  577. return ([self compare:aDate] == NSOrderedDescending);
  578. }
  579. // Thanks, markrickert
  580. - (BOOL) isInFuture
  581. {
  582. return ([self isLaterThanDate:[NSDate date]]);
  583. }
  584. // Thanks, markrickert
  585. - (BOOL) isInPast
  586. {
  587. return ([self isEarlierThanDate:[NSDate date]]);
  588. }
  589. #pragma mark - Roles
  590. - (BOOL) isTypicallyWeekend
  591. {
  592. NSDateComponents *components = [[NSDate currentCalendar] components:NSCalendarUnitWeekday fromDate:self];
  593. if ((components.weekday == 1) ||
  594. (components.weekday == 7))
  595. return YES;
  596. return NO;
  597. }
  598. - (BOOL) isTypicallyWorkday
  599. {
  600. return ![self isTypicallyWeekend];
  601. }
  602. #pragma mark - Adjusting Dates
  603. // Thaks, rsjohnson
  604. - (NSDate *) dateByAddingYears: (NSInteger) dYears
  605. {
  606. NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
  607. [dateComponents setYear:dYears];
  608. NSDate *newDate = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents toDate:self options:0];
  609. return newDate;
  610. }
  611. - (NSDate *) dateBySubtractingYears: (NSInteger) dYears
  612. {
  613. return [self dateByAddingYears:-dYears];
  614. }
  615. - (NSDate *) dateByAddingMonths: (NSInteger) dMonths
  616. {
  617. NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
  618. [dateComponents setMonth:dMonths];
  619. NSDate *newDate = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents toDate:self options:0];
  620. return newDate;
  621. }
  622. - (NSDate *) dateBySubtractingMonths: (NSInteger) dMonths
  623. {
  624. return [self dateByAddingMonths:-dMonths];
  625. }
  626. // Courtesy of dedan who mentions issues with Daylight Savings
  627. - (NSDate *) dateByAddingDays: (NSInteger) dDays
  628. {
  629. NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
  630. [dateComponents setDay:dDays];
  631. NSDate *newDate = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents toDate:self options:0];
  632. return newDate;
  633. }
  634. - (NSDate *) dateBySubtractingDays: (NSInteger) dDays
  635. {
  636. return [self dateByAddingDays: (dDays * -1)];
  637. }
  638. - (NSDate *) dateByAddingHours: (NSInteger) dHours
  639. {
  640. NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + D_HOUR * dHours;
  641. NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval];
  642. return newDate;
  643. }
  644. - (NSDate *) dateBySubtractingHours: (NSInteger) dHours
  645. {
  646. return [self dateByAddingHours: (dHours * -1)];
  647. }
  648. - (NSDate *) dateByAddingMinutes: (NSInteger) dMinutes
  649. {
  650. NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + D_MINUTE * dMinutes;
  651. NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval];
  652. return newDate;
  653. }
  654. - (NSDate *) dateBySubtractingMinutes: (NSInteger) dMinutes
  655. {
  656. return [self dateByAddingMinutes: (dMinutes * -1)];
  657. }
  658. - (NSDateComponents *) componentsWithOffsetFromDate: (NSDate *) aDate
  659. {
  660. NSDateComponents *dTime = [[NSDate currentCalendar] components:componentFlags fromDate:aDate toDate:self options:0];
  661. return dTime;
  662. }
  663. #pragma mark - Extremes
  664. - (NSDate *) dateAtStartOfDay
  665. {
  666. NSDateComponents *components = [[NSDate currentCalendar] components:componentFlags fromDate:self];
  667. components.hour = 0;
  668. components.minute = 0;
  669. components.second = 0;
  670. return [[NSDate currentCalendar] dateFromComponents:components];
  671. }
  672. // Thanks gsempe & mteece
  673. - (NSDate *) dateAtEndOfDay
  674. {
  675. NSDateComponents *components = [[NSDate currentCalendar] components:componentFlags fromDate:self];
  676. components.hour = 23; // Thanks Aleksey Kononov
  677. components.minute = 59;
  678. components.second = 59;
  679. return [[NSDate currentCalendar] dateFromComponents:components];
  680. }
  681. #pragma mark - Retrieving Intervals
  682. - (NSInteger) minutesAfterDate: (NSDate *) aDate
  683. {
  684. NSTimeInterval ti = [self timeIntervalSinceDate:aDate];
  685. return (NSInteger) (ti / D_MINUTE);
  686. }
  687. - (NSInteger) minutesBeforeDate: (NSDate *) aDate
  688. {
  689. NSTimeInterval ti = [aDate timeIntervalSinceDate:self];
  690. return (NSInteger) (ti / D_MINUTE);
  691. }
  692. - (NSInteger) hoursAfterDate: (NSDate *) aDate
  693. {
  694. NSTimeInterval ti = [self timeIntervalSinceDate:aDate];
  695. return (NSInteger) (ti / D_HOUR);
  696. }
  697. - (NSInteger) hoursBeforeDate: (NSDate *) aDate
  698. {
  699. NSTimeInterval ti = [aDate timeIntervalSinceDate:self];
  700. return (NSInteger) (ti / D_HOUR);
  701. }
  702. - (NSInteger) daysAfterDate: (NSDate *) aDate
  703. {
  704. NSTimeInterval ti = [self timeIntervalSinceDate:aDate];
  705. return (NSInteger) (ti / D_DAY);
  706. }
  707. - (NSInteger) daysBeforeDate: (NSDate *) aDate
  708. {
  709. NSTimeInterval ti = [aDate timeIntervalSinceDate:self];
  710. return (NSInteger) (ti / D_DAY);
  711. }
  712. // Thanks, dmitrydims
  713. // I have not yet thoroughly tested this
  714. - (NSInteger)distanceInDaysToDate:(NSDate *)anotherDate
  715. {
  716. NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
  717. NSDateComponents *components = [gregorianCalendar components:NSCalendarUnitDay fromDate:self toDate:anotherDate options:0];
  718. return components.day;
  719. }
  720. #pragma mark - Decomposing Dates
  721. - (NSInteger) nearestHour
  722. {
  723. NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] + D_MINUTE * 30;
  724. NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval];
  725. NSDateComponents *components = [[NSDate currentCalendar] components:NSCalendarUnitHour fromDate:newDate];
  726. return components.hour;
  727. }
  728. - (NSInteger) hour
  729. {
  730. NSDateComponents *components = [[NSDate currentCalendar] components:componentFlags fromDate:self];
  731. return components.hour;
  732. }
  733. - (NSInteger) minute
  734. {
  735. NSDateComponents *components = [[NSDate currentCalendar] components:componentFlags fromDate:self];
  736. return components.minute;
  737. }
  738. - (NSInteger) seconds
  739. {
  740. NSDateComponents *components = [[NSDate currentCalendar] components:componentFlags fromDate:self];
  741. return components.second;
  742. }
  743. - (NSInteger) day
  744. {
  745. NSDateComponents *components = [[NSDate currentCalendar] components:componentFlags fromDate:self];
  746. return components.day;
  747. }
  748. - (NSInteger) month
  749. {
  750. NSDateComponents *components = [[NSDate currentCalendar] components:componentFlags fromDate:self];
  751. return components.month;
  752. }
  753. - (NSInteger) week
  754. {
  755. NSDateComponents *components = [[NSDate currentCalendar] components:componentFlags fromDate:self];
  756. return components.weekOfMonth;
  757. }
  758. - (NSInteger) weekday
  759. {
  760. NSDateComponents *components = [[NSDate currentCalendar] components:componentFlags fromDate:self];
  761. return components.weekday;
  762. }
  763. - (NSInteger) nthWeekday // e.g. 2nd Tuesday of the month is 2
  764. {
  765. NSDateComponents *components = [[NSDate currentCalendar] components:componentFlags fromDate:self];
  766. return components.weekdayOrdinal;
  767. }
  768. - (NSInteger) year
  769. {
  770. NSDateComponents *components = [[NSDate currentCalendar] components:componentFlags fromDate:self];
  771. return components.year;
  772. }
  773. + (NSDate *)date:(NSString *)datestr WithFormat:(NSString *)format
  774. {
  775. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  776. [dateFormatter setLocale:[NSLocale currentLocale]];
  777. [dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
  778. [dateFormatter setDateFormat:format];
  779. NSDate *date = [dateFormatter dateFromString:datestr];
  780. #if ! __has_feature(objc_arc)
  781. [dateFormatter release];
  782. #endif
  783. return date;
  784. }
  785. - (NSDate *)dateWithYMD
  786. {
  787. NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
  788. fmt.dateFormat = @"yyyy-MM-dd";
  789. NSString *selfStr = [fmt stringFromDate:self];
  790. return [fmt dateFromString:selfStr];
  791. }
  792. -(NSDate *)dateWithFormatter:(NSString *)formatter {
  793. NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
  794. fmt.dateFormat = formatter;
  795. NSString *selfStr = [fmt stringFromDate:self];
  796. return [fmt dateFromString:selfStr];
  797. }
  798. @end
  799. @implementation UIView (Extension)
  800. #pragma mark - frame
  801. - (void)setX:(CGFloat)x {
  802. CGRect frame = self.frame;
  803. frame.origin.x = x;
  804. self.frame = frame;
  805. }
  806. - (void)setY:(CGFloat)y {
  807. CGRect frame = self.frame;
  808. frame.origin.y = y;
  809. self.frame = frame;
  810. }
  811. - (CGFloat)x {
  812. return self.frame.origin.x;
  813. }
  814. - (CGFloat)y {
  815. return self.frame.origin.y;
  816. }
  817. - (void)setCenterX:(CGFloat)centerX {
  818. CGPoint center = self.center;
  819. center.x = centerX;
  820. self.center = center;
  821. }
  822. - (CGFloat)centerX {
  823. return self.center.x;
  824. }
  825. - (void)setCenterY:(CGFloat)centerY{
  826. CGPoint center = self.center;
  827. center.y = centerY;
  828. self.center = center;
  829. }
  830. - (CGFloat)centerY {
  831. return self.center.y;
  832. }
  833. - (void)setWidth:(CGFloat)width {
  834. CGRect frame = self.frame;
  835. frame.size.width = width;
  836. self.frame = frame;
  837. }
  838. - (void)setHeight:(CGFloat)height {
  839. CGRect frame = self.frame;
  840. frame.size.height = height;
  841. self.frame = frame;
  842. }
  843. - (CGFloat)height {
  844. return self.frame.size.height;
  845. }
  846. - (CGFloat)width {
  847. return self.frame.size.width;
  848. }
  849. - (void)setSize:(CGSize)size {
  850. CGRect frame = self.frame;
  851. frame.size = size;
  852. self.frame = frame;
  853. }
  854. - (CGSize)size {
  855. return self.frame.size;
  856. }
  857. - (void)setOrigin:(CGPoint)origin {
  858. CGRect frame = self.frame;
  859. frame.origin = origin;
  860. self.frame = frame;
  861. }
  862. - (CGPoint)origin {
  863. return self.frame.origin;
  864. }
  865. - (CGFloat)top {
  866. return self.frame.origin.y;
  867. }
  868. - (void)setTop:(CGFloat)top {
  869. CGRect frame = self.frame;
  870. frame.origin.y = top;
  871. self.frame = frame;
  872. }
  873. - (CGFloat)left {
  874. return self.frame.origin.x;
  875. }
  876. - (void)setLeft:(CGFloat)left {
  877. CGRect frame = self.frame;
  878. frame.origin.x = left;
  879. self.frame = frame;
  880. }
  881. - (CGFloat)bottom {
  882. return self.frame.size.height + self.frame.origin.y;
  883. }
  884. - (void)setBottom:(CGFloat)bottom {
  885. CGRect frame = self.frame;
  886. frame.origin.y = bottom - frame.size.height;
  887. self.frame = frame;
  888. }
  889. - (CGFloat)right {
  890. return self.frame.size.width + self.frame.origin.x;
  891. }
  892. - (void)setRight:(CGFloat)right {
  893. CGRect frame = self.frame;
  894. frame.origin.x = right - frame.size.width;
  895. self.frame = frame;
  896. }
  897. #pragma mark - layer
  898. - (void)rounded:(CGFloat)cornerRadius {
  899. [self rounded:cornerRadius width:0 color:nil];
  900. }
  901. - (void)border:(CGFloat)borderWidth color:(UIColor *)borderColor {
  902. [self rounded:0 width:borderWidth color:borderColor];
  903. }
  904. - (void)rounded:(CGFloat)cornerRadius width:(CGFloat)borderWidth color:(UIColor *)borderColor {
  905. self.layer.cornerRadius = cornerRadius;
  906. self.layer.borderWidth = borderWidth;
  907. self.layer.borderColor = [borderColor CGColor];
  908. self.layer.masksToBounds = YES;
  909. }
  910. -(void)round:(CGFloat)cornerRadius RectCorners:(UIRectCorner)rectCorner {
  911. UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:rectCorner cornerRadii:CGSizeMake(cornerRadius, cornerRadius)];
  912. CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
  913. maskLayer.frame = self.bounds;
  914. maskLayer.path = maskPath.CGPath;
  915. self.layer.mask = maskLayer;
  916. }
  917. -(void)shadow:(UIColor *)shadowColor opacity:(CGFloat)opacity radius:(CGFloat)radius offset:(CGSize)offset {
  918. //给Cell设置阴影效果
  919. self.layer.masksToBounds = NO;
  920. self.layer.shadowColor = shadowColor.CGColor;
  921. self.layer.shadowOpacity = opacity;
  922. self.layer.shadowRadius = radius;
  923. self.layer.shadowOffset = offset;
  924. }
  925. #pragma mark - base
  926. - (UIViewController *)viewController {
  927. id nextResponder = [self nextResponder];
  928. while (nextResponder != nil) {
  929. if ([nextResponder isKindOfClass:[UIViewController class]]) {
  930. UIViewController *vc = (UIViewController *)nextResponder;
  931. return vc;
  932. }
  933. nextResponder = [nextResponder nextResponder];
  934. }
  935. return nil;
  936. }
  937. + (CGFloat)getLabelHeightByWidth:(CGFloat)width Title:(NSString *)title font:(UIFont *)font {
  938. UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, width, 0)];
  939. label.text = title;
  940. label.font = font;
  941. label.numberOfLines = 0;
  942. [label sizeToFit];
  943. CGFloat height = label.frame.size.height;
  944. return height;
  945. }
  946. @end