iOS-简单日历
2018-05-08 本文已影响25人
勇敢的_心_
效果图:
date.png
简单代码:
#define collectionH (kMainScreenWidth-20)*6/7
#define itemMargin 0
NSString *const cellIdentifier = @"sttenceCell";
<UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout>{
UICollectionViewFlowLayout *_flowLayout;
}
@ppoperty(nonstick,strong) UIView *contentView;
@property(nonatomic,strong) UIView *topView;
@property(nonatomic,strong) UICollectionView *collectionView;
@property(nonatomic,strong) UILabel *monthLabel;
@property(nonatomic,strong) UIButton *previousBtn;
@property(nonatomic,strong) UIButton *nextBtn;
@property(nonatomic,strong) NSArray *weekDayArray;
@property (nonatomic , strong) NSDate *date;
@property (nonatomic , strong) NSDate *today;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *contentViewHeight;
_contentViewHeight.constant = collectionH+84;
NSDate *day = [NSDate date];
self.today = day;
self.date = self.today;
NSString *thisMonth =[NSString stringWithFormat:@"%li-%.2ld",[self year:self.date],[self month:self.date]];
self.topView = [[UIView alloc] initWithFrame:CGRectMake(0,0, kMainScreenWidth, 84)];
self.topView.backgroundColor = [UIColor whiteColor];
[self.contentView addSubview:self.topView];
self.previousBtn = [[UIButton alloc] initWithFrame:CGRectMake(10, 0, 40, 40)];
[self.previousBtn setImage:[UIImage imageNamed:@"backGray"] forState:UIControlStateNormal];
[self.previousBtn setImage:[UIImage imageNamed:@"backGray"] forState:UIControlStateHighlighted];
[self.previousBtn addTarget:self action:@selector(previousBtnClick:) forControlEvents:UIControlEventTouchUpInside];
[self.topView addSubview:self.previousBtn];
self.nextBtn = [[UIButton alloc] initWithFrame:CGRectMake(kMainScreenWidth-10-40, 0, 40, 40)];
[self.nextBtn setImage:[UIImage imageNamed:@"rightArrow"] forState:UIControlStateNormal];
[self.nextBtn setImage:[UIImage imageNamed:@"rightArrow"] forState:UIControlStateHighlighted];
[self.nextBtn addTarget:self action:@selector(nextBtnClick:) forControlEvents:UIControlEventTouchUpInside];
[self.topView addSubview:self.nextBtn];
self.monthLabel = [[UILabel alloc] initWithFrame:CGRectMake(10+40, 0, kMainScreenWidth-100, 40)];
self.monthLabel.text = @"2018年2月";
self.monthLabel.textColor = [UIColor lightGrayColor];
self.monthLabel.textAlignment = NSTextAlignmentCenter;
[self.topView addSubview:self.monthLabel];
UIView *weekV = [[UIView alloc] initWithFrame:CGRectMake(0, 40, kMainScreenWidth, 44)];
weekV.backgroundColor = RGB(234, 234, 234);
[self.topView addSubview:weekV];
_weekDayArray = @[@"周日",@"周一",@"周二",@"周三",@"周四",@"周五",@"周六"];
CGFloat weekW = (kMainScreenWidth-20)/7;
for (int i = 0; i< 7; i++) {
UILabel *week = [[UILabel alloc] init];
week.text = _weekDayArray[i];
week.textColor = [UIColor darkGrayColor];
week.textAlignment = NSTextAlignmentCenter;
week.frame = CGRectMake(10+weekW*i, 0, weekW, 44);
[weekV addSubview:week];
}
// collectionView
_flowLayout = [[UICollectionViewFlowLayout alloc] init];
UIView *collectView = [[UIView alloc] initWithFrame:CGRectMake(0,84, kMainScreenWidth, collectionH)];
collectView.backgroundColor = [UIColor whiteColor];
[self.contentView addSubview:collectView];
self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(10,0, kMainScreenWidth-20, collectionH) collectionViewLayout:_flowLayout];
//self.collectionView.backgroundColor = RGB(244, 244, 244);
self.collectionView.backgroundColor = [UIColor whiteColor];
[collectView addSubview:self.collectionView];
self.collectionView.dataSource = self;
self.collectionView.delegate = self;
// 布局
CGFloat topPading = itemMargin;
CGFloat itemSpacing = itemMargin;
CGFloat lineSpacing = itemMargin;
CGFloat leftPading = itemMargin;
CGFloat itemW = (kMainScreenWidth-20-8*itemMargin)/7;
CGFloat itemH = itemW;
_flowLayout.itemSize = CGSizeMake(itemW, itemH);
_flowLayout.minimumInteritemSpacing = itemSpacing;
_flowLayout.minimumLineSpacing = lineSpacing;
_flowLayout.sectionInset = UIEdgeInsetsMake(topPading, leftPading, topPading, leftPading);
[_collectionView setCollectionViewLayout:_flowLayout animated:YES];
//注册cell
[_collectionView registerNib:[UINib nibWithNibName:@"GEAttendanceCell" bundle:nil] forCellWithReuseIdentifier:attenceCellIdentifier];
- (void)setDate:(NSDate *)date
{
_date = date;
[_monthLabel setText:[NSString stringWithFormat:@"%li-%.2ld",[self year:date],[self month:date]]];
}
#pragma -mark collectionView delegate
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return 1;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
NSInteger daysInThisMonth = [self totaldaysInMonth:_date];
NSInteger firstWeekday = [self firstWeekdayInThisMonth:_date];
NSUInteger count = daysInThisMonth+firstWeekday;
return count;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
GEAttendanceCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:attenceCellIdentifier forIndexPath:indexPath];
NSInteger daysInThisMonth = [self totaldaysInMonth:_date];
NSInteger firstWeekday = [self firstWeekdayInThisMonth:_date];
NSInteger day = 0;
NSInteger i = indexPath.row;
if (i < firstWeekday) {
cell.contentView.hidden = YES;
cell.layer.borderWidth=0.0;
}else if (i > firstWeekday + daysInThisMonth - 1){
//cell.contentVIew.hidden = YES;
}else{
cell.contentView.hidden = NO;
day = i - firstWeekday + 1;
[cell.dateTime setText:[NSString stringWithFormat:@"%li",day]];
[cell.dateTime setTextColor:[UIColor darkGrayColor]];
//NSUInteger inx = indexPath.row-firstWeekday;
//cell.attencesModel = _attendaceLsit[inx];
// cell.markLabel.backgroundColor = [UIColor whiteColor];
//this month
if ([_today isEqualToDate:_date]) {
if (day == [self day:_date]) {
cell.dateTime.backgroundColor = RGB(0, 207, 151);
cell.dateTime.layer.cornerRadius=10;
cell.dateTime.layer.masksToBounds=YES;
} else if (day > [self day:_date]) {
[cell.dateTime setTextColor:[UIColor lightGrayColor]];
}
} else if ([_today compare:_date] == NSOrderedAscending) {
[cell.dateTime setTextColor:[UIColor lightGrayColor]];
}
cell.layer.borderColor=RGB(244, 244, 244).CGColor;
cell.layer.borderWidth=0.3;
}
return cell;
}
- (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
NSInteger daysInThisMonth = [self totaldaysInMonth:_date];
NSInteger firstWeekday = [self firstWeekdayInThisMonth:_date];
NSInteger day = 0;
NSInteger i = indexPath.row;
if (i >= firstWeekday && i <= firstWeekday + daysInThisMonth - 1) {
day = i - firstWeekday + 1;
//this month
if ([_today isEqualToDate:_date]) {
if (day <= [self day:_date]) {
return YES;
}
} else if ([_today compare:_date] == NSOrderedDescending) {
return YES;
}
}
return NO;
}
#pragma mark btnClick
- (void)previousBtnClick:(UIButton *)btn
{
self.previousBtn.enabled = NO;
[self performSelector:@selector(previousbtn:) withObject:nil afterDelay:1.0f];
self.date = [self lastMonth:self.date];
//NSString *pTime =[NSString stringWithFormat:@"%li%.2ld-%ld",[self year:self.date],[self month:self.date],[self totaldaysInMonth:self.date]];
NSString *pTime =[NSString stringWithFormat:@"%li%.2ld",[self year:self.date],[self month:self.date]];
[self loadHttpDataWithAttendanceDate:pTime];
}
- (void)nextBtnClick:(UIButton *)btn
{
self.nextBtn.enabled = NO;
[self performSelector:@selector(nextbtn:) withObject:nil afterDelay:1.0f];
self.date = [self nextMonth:self.date];
NSString *nTime =[NSString stringWithFormat:@"%li%.2ld",[self year:self.date],[self month:self.date]];
[self loadHttpDataWithAttendanceDate:nTime];
}
- (void)previousbtn:(UIButton *)btn
{
self.previousBtn.enabled = YES;
}
- (void)nextbtn:(UIButton *)btn
{
self.nextBtn.enabled = YES;
}
#pragma mark - date
- (NSInteger)day:(NSDate *)date{
NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:date];
return [components day];
}
- (NSInteger)month:(NSDate *)date{
NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:date];
return [components month];
}
- (NSInteger)year:(NSDate *)date{
NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:date];
return [components year];
}
- (NSInteger)firstWeekdayInThisMonth:(NSDate *)date{
NSCalendar *calendar = [NSCalendar currentCalendar];
[calendar setFirstWeekday:1];//1.Sun. 2.Mon. 3.Thes. 4.Wed. 5.Thur. 6.Fri. 7.Sat.
NSDateComponents *comp = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:date];
[comp setDay:1];
NSDate *firstDayOfMonthDate = [calendar dateFromComponents:comp];
NSUInteger firstWeekday = [calendar ordinalityOfUnit:NSCalendarUnitWeekday inUnit:NSCalendarUnitWeekOfMonth forDate:firstDayOfMonthDate];
return firstWeekday - 1;
}
- (NSInteger)totaldaysInThisMonth:(NSDate *)date{
NSRange totaldaysInMonth = [[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date];
return totaldaysInMonth.length;
}
- (NSInteger)totaldaysInMonth:(NSDate *)date{
NSRange daysInLastMonth = [[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date];
return daysInLastMonth.length;
}
- (NSDate *)lastMonth:(NSDate *)date{
NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
dateComponents.month = -1;
NSDate *newDate = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents toDate:date options:0];
return newDate;
}
- (NSDate*)nextMonth:(NSDate *)date{
NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
dateComponents.month = +1;
NSDate *newDate = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents toDate:date options:0];
return newDate;
}