美文网首页
iOS---记一次写日历的心得

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

作者: 乐逍遥的笔记 | 来源:发表于2017-11-13 11:31 被阅读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

    相关文章

      网友评论

          本文标题:iOS---记一次写日历的心得

          本文链接:https://www.haomeiwen.com/subject/nbmujxtx.html