# 在iOS上实现一个简单的日历控件

@interface NSDate (WQCalendarLogic)

0. 首先需要知道这个月有多少天：

- (NSUInteger)numberOfDaysInCurrentMonth
{
// 频繁调用 [NSCalendar currentCalendar] 可能存在性能问题
return [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:self].length;
}

1. 确定这个月的第一天是星期几。这样就能知道给定月份的第一周有几天：

- (NSDate *)firstDayOfCurrentMonth
{
NSDate *startDate = nil;
BOOL ok = [[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&startDate interval:NULL forDate:self];
NSAssert1(ok, @"Failed to calculate the first day of the month based on %@", self);
return startDate;
}

- (NSUInteger)weeklyOrdinality
{
return [[NSCalendar currentCalendar] ordinalityOfUnit:NSDayCalendarUnit inUnit:NSWeekCalendarUnit forDate:self];
}

2. 减去第一周的天数，剩余天数除以7，得到倍数和余数：

- (NSUInteger)numberOfWeeksInCurrentMonth
{
NSUInteger weekday = [[self firstDayOfCurrentMonth] weeklyOrdinality];

NSUInteger days = [self numberOfDaysInCurrentMonth];
NSUInteger weeks = 0;

if (weekday > 1) {
weeks += 1, days -= (7 - weekday + 1);
}

weeks += days / 7;
weeks += (days % 7 > 0) ? 1 : 0;

return weeks;
}

@interface WQCalendarTileView : UIView

@interface WQCalendarGridView : UIView

@property (nonatomic, weak) id<WQCalendarGridViewDataSource> dataSource;
@property (nonatomic, weak) id<WQCalendarGridViewDelegate> delegate;

- (void)reloadData;

@class WQCalendarGridView;

@protocol WQCalendarGridViewDataSource <NSObject>

@required

- (NSUInteger)numberOfRowsInGridView:(WQCalendarGridView *)gridView;

- (WQCalendarTileView *)gridView:(WQCalendarGridView *)gridView tileViewForRow:(NSUInteger)row column:(NSUInteger)column;

@optional

- (CGFloat)heightForRowInGridView:(WQCalendarGridView *)gridView;

@end

@protocol WQCalendarGridViewDelegate <NSObject>

- (void)gridView:(WQCalendarGridView *)gridView didSelectAtRow:(NSUInteger)row column:(NSUInteger)column;

@end

#pragma mark - method to calculate days in previous, current and the following month.

- (void)calculateDaysInPreviousMonthWithDate:(NSDate *)date
{
NSUInteger weeklyOrdinality = [[date firstDayOfCurrentMonth] weeklyOrdinality];
NSDate *dayInThePreviousMonth = [date dayInThePreviousMonth];

NSUInteger daysCount = [dayInThePreviousMonth numberOfDaysInCurrentMonth];
NSUInteger partialDaysCount = weeklyOrdinality - 1;

NSDateComponents *components = [dayInThePreviousMonth YMDComponents];

self.daysInPreviousMonth = [NSMutableArray arrayWithCapacity:partialDaysCount];
for (int i = daysCount - partialDaysCount + 1; i < daysCount + 1; ++i) {
WQCalendarDay *calendarDay = [WQCalendarDay calendarDayWithYear:components.year month:components.month day:i];
}
}

- (void)calculateDaysInCurrentMonthWithDate:(NSDate *)date
{
NSUInteger daysCount = [date numberOfDaysInCurrentMonth];
NSDateComponents *components = [date YMDComponents];

self.daysInCurrentMonth = [NSMutableArray arrayWithCapacity:daysCount];
for (int i = 1; i < daysCount + 1; ++i) {
WQCalendarDay *calendarDay = [WQCalendarDay calendarDayWithYear:components.year month:components.month day:i];
}
}

- (void)calculateDaysInFollowingMonthWithDate:(NSDate *)date
{
NSUInteger weeklyOrdinality = [[date lastDayOfCurrentMonth] weeklyOrdinality];
if (weeklyOrdinality == 7) return ;

NSUInteger partialDaysCount = 7 - weeklyOrdinality;
NSDateComponents *components = [[date dayInTheFollowingMonth] YMDComponents];

self.daysInFollowingMonth = [NSMutableArray arrayWithCapacity:partialDaysCount];
for (int i = 1; i < partialDaysCount + 1; ++i) {
WQCalendarDay *calendarDay = [WQCalendarDay calendarDayWithYear:components.year month:components.month day:i];
}
}

• 本文已收录于以下专栏：

## iOS之自定义简单的日历控件

iOS并没有系统日历控件，但是说白了就是基于UICollectionView的封装，对于UICollectionView我就不说他的创建了，主要难在数据的处理，下面我就说一下处理数据的思路： 我将数...
• qq_33623316
• 2017年04月10日 14:27
• 2357

## iOS 【一行代码集成一款精致的第三方OC日历——WZYCalendar】

• Felicity294250051
• 2016年12月25日 18:23
• 8395

## iOS控件之日历

iOS没用日历控件,所以我们需要自己进行封装,博主是用的CollectionView封装的 其实难就难在如何处理数据,下面上代码 这里是我封装的CollectionView,继承UICollectio...
• qq_16437739
• 2016年02月25日 16:45
• 3553

## iOS日历视图 FSCalendar的使用

• u012914828
• 2016年11月30日 16:24
• 4704

## IOS日历控件(支持单日、多日选择)

• 2016年01月18日 15:27
• 124KB
• 下载

## iOS添加事件到系统日历

• sinat_27310637
• 2016年06月07日 13:29
• 2236

## UIDatePicker 日期/时间选取器(滚轮)—IOS开发

• iukey
• 2012年03月07日 00:58
• 90620

## IOS 开发笔记——做日历开发的总结

• github_29614995
• 2015年08月31日 20:27
• 2709

## iOS无限滚动，实现ios原生日历

• zyx196
• 2015年10月28日 15:56
• 2517

## 仿IOS日期控件(增加上下午，时分选择)

• 2015年06月01日 15:14
• 1.44MB
• 下载

举报原因： 您举报文章：在iOS上实现一个简单的日历控件 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)