iOS---记一次写日历的心得

2017-11-13  本文已影响32人  乐逍遥的笔记

因为最近项目的需求中需要做一个日历,效果类似于钉钉日历中的那种效果,下滑展开可以进行按月份滑动,上滑可以让日历收缩,滑动效果按周进行滑,之前也看了好多的Demo,但总觉得效果不适合自己想要的,所以就想自己尝试写一个,Demo中有各种瑕疵,还请各位不瑟吝教。这篇文章主要是将写日历的整个过程分享给需要的朋友们。

日历的主体部分主要使用到了UICollectionView,NSCalendar,NSDate,NSDateComponents这几个比较核心的类,但是也相应用到了其他东西。在此之前,也对其中几个类做了一些了解吧。

NSCalendar这个类提供给了开发者一些方法来获取日期对象(NSDate)的年月日时分秒的信息。例如在本次Demo中,要用的是获取当前时间:NSCalendar *calendar = [NSCalendar currentCalendar];

NSDateComponents也是和日期相关的一个类,从字面意思上,Components是零件组成的意思,他是配合NSCalendar,NSDate这两个类把一个日期分割成年月日时分秒的。

例如:在获取当前时间的时候

NSCalendar *calendar = [NSCalendar currentCalendar];

NSDateComponents  *components  =  [calendar components:NSCalendarUnitMinute | NSCalendarUnitMonth | NSCalendarUnitHour | NSCalendarUnitDay fromDate:[NSDate date]];

NSLog(@"%ld月%ld日%ld时%ld分" ,(long)components.month,(long)components.day,(long)components.hour,(long)components.minute);

因为在这个日历中需要用到的一些工具类方法比较多,所以单独封装了一个类,来获取当月日期、上个月下个月有几天、本月的第一天从周几开始等等的一些方法:

/**

枚举出所有的时间类型

TimeType_Year,年

TimeType_Month,月

TimeType_Day,日

TimeType_Hour,时

TimeType_Minite,分

TimeType_Second,秒

*/

typedef enum : NSUInteger {

TimeType_Year,

TimeType_Month,

TimeType_Day,

TimeType_Hour,

TimeType_Minute,

TimeType_Second,

} TimeType;

@interface SXYDateToolsObject : NSObject

+ (SXYDateToolsObject *)manager;

/**

获取当前日期所在周最后一天(日-六 也就是周六)

@param date 当前日期

@return 返回日期

*/

- (NSDate *)getLastdayOfTheWeek:(NSDate *)date;

/**

获取当天是周几

@param date 当天日期

@return 周数(1-7  ->  日-六)

*/

- (NSInteger)getNumberInWeek:(NSDate *)date;

/**

返回传入时间月份第一天

@param pDate 传入时间

@return 第一天

*/

- (NSDate *)GetFirstDayOfMonth:(NSDate *)pDate;

/**

* 时间返回字符串

*/

- (NSString *)getStrFromDateFormat:(NSString *)format Date:(NSDate *)date;

/**

* 获取上个月的时间

*/

- (NSDate*)getPreviousMonth:(NSDate*)_date;

/**

* 获取下一个月的时间

*/

- (NSDate*)getNextMonth:(NSDate*)_date;

/**

* 获取本月第一天是星期几

*/

- (NSInteger)currentFirstDay:(NSDate *)date;

/**

* 获取本月总天数

*/

- (NSInteger)currentMonthOfDay:(NSDate *)date;

/**

* 判断两个月份是不是一样的

*/

- (BOOL)checkSameMonth:(NSDate*)_month1 AnotherMonth:(NSDate*)_month2;

/**

* 获取一个月有多少行

*/

- (NSInteger)getRows:(NSDate *)myDate;

/**

* 字符串返回时间

*/

- (NSDate *)getDataFromStrFormat:(NSString *)format String:(NSString *)str;

/**

* 判断两天是不是同一天 //固定yyyy-mm-dd

*/

- (BOOL)checkSameDate:(NSString *)date1 AnotherDate:(NSDate *)date2;

/**

* 判断两天是不是同一天

*/

- (BOOL)isSameDate:(NSDate *)date1 AnotherDate:(NSDate *)date2;

/**

* 获取某天零点时间

*/

- (NSDate *)getStartDateWithDate:(NSDate *)date;

/**

将时间字符串转换成新的时间字符串

@param oldStrDate 旧的时间

@param oldFormat 旧的格式

@param newFormat 新的时间格式

@return 返回

*/

- (NSString *)getStrDateFromStrDate:(NSString *)oldStrDate OldFormat:(NSString *)oldFormat ByNewFormat:(NSString *)newFormat;

/**

获取某个时间前后时间

@param currentDate 当前时间

@param lead 距离时间 正数往后推  负数往前推

@param timeType 时间类型(0-年  1-月 2-日 3-时 4-分 5-秒)

@return 返回结果时间

*/

- (NSDate *)getEarlyOrLaterDate:(NSDate *)currentDate LeadTime:(NSInteger)lead Type:(TimeType )timeType;

Demo参考地址:http://code.cocoachina.com/view/136268

上一篇 下一篇

猜你喜欢

热点阅读