iOS之自定义简单的日历控件
2017-04-10 14:27
429 查看
iOS并没有系统日历控件,但是说白了就是基于UICollectionView的封装,对于UICollectionView我就不说他的创建了,主要难在数据的处理,下面我就说一下处理数据的思路:
我将数据分为三部分进行处理:如下图:
- (NSDateComponents *)components:(NSCalendarUnit)unitFlags
fromDate:(NSDate *)date;//该方法可以以date获取到星期,
- (NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate
*)date;//可以获取到某一个月的天
4000
数范围。
代码实现:
@property (nonatomic, strong) NSCalendar *calendar; @property (nonatomic, assign) NSInteger day;//天 @property (nonatomic, assign) NSInteger month;//月 @property (nonatomic, assign) NSInteger year;//年 @property (nonatomic, strong) NSMutableArray *dayArray;
NSDateComponents *nowCompoents =[self.calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:[NSDate date]]; self.year = nowCompoents.year; self.month = nowCompoents.month; self.day = nowCompoents.day; self.dayArray = [[NSMutableArray alloc] init]; - (NSArray *)setDayArr { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd"]; NSDate * nowDate = [dateFormatter dateFromString:[NSString stringWithFormat:@"%ld-%ld-%ld",_year,_month,_day]]; //本月的天数范围 NSRange dayRange = [_calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:nowDate]; //上个月的天数范围 NSRange lastdayRange = [_calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:[self setLastMonthWithDay]]; //本月第一天的NSDate对象 NSDate *nowMonthfirst = [dateFormatter dateFromString:[NSString stringWithFormat:@"%ld-%ld-%d",_year,_month,1]]; //本月第一天是星期几 NSDateComponents * components = [_calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday fromDate:nowMonthfirst]; //本月最后一天的NSDate对象 NSDate * nextDay = [dateFormatter dateFromString:[NSString stringWithFormat:@"%ld-%ld-%ld",_year,_month,dayRange.length]]; NSDateComponents * lastDay = [_calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday fromDate:nextDay]; //上个月遗留的天数 for (NSInteger i = lastdayRange.length - components.weekday + 2; i <= lastdayRange.length; i++) { NSString * string = [NSString stringWithFormat:@"%ld",i]; [self.dayArray addObject:string]; } //本月的总天数 for (NSInteger i = 1; i <= dayRange.length ; i++) { NSString * string = [NSString stringWithFormat:@"%ld",i]; [self.dayArray addObject:string]; } //下个月空出的天数 for (NSInteger i = 1; i <= (7 - lastDay.weekday); i++) { NSString * string = [NSString stringWithFormat:@"%ld",i]; [self.dayArray addObject:string]; } self.index = components.weekday - 2 + self.day; self.block(_year, _month); return self.dayArray; } //返回上个月第一天的NSDate对象 - (NSDate *)setLastMonthWithDay { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd"]; NSDate * date = nil; if (self.month != 1) { date = [dateFormatter dateFromString:[NSString stringWithFormat:@"%ld-%ld-%d",self.year,self.month-1,01]]; }else{ date = [dateFormatter dateFromString:[NSString stringWithFormat:@"%ld-%d-%d",self.year - 1,12,01]]; } return date; } //下个月的数据 - (NSArray *)nextMonthDataArr { [self.dayArray removeAllObjects]; if (_month == 12) { _month = 1; _year ++; }else { _month ++; } return [self setDayArr]; } //上个月的数据 - (NSArray *)lastMonthDataArr { [self.dayArray removeAllObjects]; if (_month == 1) { _month = 12; _year --; }else { _month --; } return [self setDayArr]; }
demo下载链接:https://github.com/baopan/Calendar
相关文章推荐
- IOS自定义日历控件的简单实现(附思想及过程)
- iOS自定义日历控件的简单实现过程
- 在iOS上实现一个简单的日历控件
- iOS自定义实现日历控件
- 在iOS上实现一个简单的日历控件
- 在iOS上实现一个简单的日历控件
- 自定义简单日历控件
- 在iOS上实现一个简单的日历控件
- 在iOS上实现一个简单的日历控件
- 在iOS上实现一个简单的日历控件
- iOS 简单易用的二维码扫描及生成二维码三方控件LFQRCode,可灵活自定义UI
- iOS自定义日历控件
- 在iOS上实现一个简单的日历控件
- 最简单的自定义日历控件
- 一个简单的Silverlight自定义日历控件
- wpf日历控件制作过程分析(2)---自定义样式属性
- 自定义控件之-一个简单的用户登录控件
- 开发简单的自定义服务器控件
- 千万级数据分页之二---一个简单的自定义分页控件
- 千万级数据分页之二---一个简单的自定义分页控件