因为最近项目的需求中需要做一个日历,效果类似于钉钉日历中的那种效果,下滑展开可以进行按月份滑动,上滑可以让日历收缩,滑动效果按周进行滑,之前也看了好多的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
网友评论