美文网首页
iOS开发日历

iOS开发日历

作者: Michael_NO1 | 来源:发表于2017-11-03 16:28 被阅读32次

由于工作需求自己写了一个日历, 大概思路是: 通过collectionView来做, 具备上一月下一月的切换, 日历样式自定义collectionViewCell就可以.
关键代码如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    _currentDate = [NSDate date];
    _firstDay = [self firstWeekdayInThisMotnth:_currentDate];
    _totalDays = [self totaldaysInMonth:_currentDate];

    [self.view addSubview:self.collectionView];
}
#pragma mark - 懒加载collectiongView
- (UICollectionView *)collectionView {
    if (!_collectionView) {
        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
        layout.minimumLineSpacing = 0;
        layout.minimumInteritemSpacing = 0;
        layout.itemSize = CGSizeMake(([UIScreen mainScreen].bounds.size.width -20) / 7, ([UIScreen mainScreen].bounds.size.width -20) / 7 * 1.6);
        layout.headerReferenceSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 165);
        layout.scrollDirection = UICollectionViewScrollDirectionVertical;
        
        _collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height) collectionViewLayout:layout];
        _collectionView.backgroundColor = [UIColor whiteColor];
        _collectionView.delegate = self;
        _collectionView.dataSource = self;
        _collectionView.contentInset = UIEdgeInsetsMake(0, 10, 0, 10);
        [_collectionView registerNib:[UINib nibWithNibName:@"CalendarCollectionViewCell" bundle:nil] forCellWithReuseIdentifier:@"CalendarCollectionViewCell"];
        // 如果有头部视图必须要先注册
        [_collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerViewIdentifier];
        _collectionView.alwaysBounceVertical = YES;
        _collectionView.alwaysBounceHorizontal = NO;
    }
    return _collectionView;
}
#pragma mark - UICollectionViewDatasource
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return _totalDays + _firstDay;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    
    HMCalendarCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"HMCalendarCollectionViewCell" forIndexPath:indexPath];
    
    NSInteger day = indexPath.item - _firstDay;
    
    [cell setDataWithIndex:day + 1 withIndex:indexPath.item];

    NSString *dayStr = @"";
    if ((day + 1) > 9) {
        dayStr = [NSString stringWithFormat:@"%zd",(day + 1)];
    } else {
        dayStr = [NSString stringWithFormat:@"0%zd",(day + 1)];
    }
    
    return cell;
}
#pragma mark - 日期的相关处理
// 上一月
- (void)lastMonthClick {
    _currentDate = [self lastMonth:_currentDate];
    _firstDay = [self firstWeekdayInThisMotnth:_currentDate];
    _totalDays = [self totaldaysInMonth:_currentDate];
    [self.collectionView reloadData];
}
// 下一月
- (void)nextMonthClick {
    _currentDate = [self nextMonth:_currentDate];
    _firstDay = [self firstWeekdayInThisMotnth:_currentDate];
    _totalDays = [self totaldaysInMonth:_currentDate];
    [self.collectionView reloadData];
}
// 计算某月的第一天为周几
- (NSInteger)firstWeekdayInThisMotnth:(NSDate *)date{
    NSCalendar *calendar = [NSCalendar currentCalendar]; // 取得当前用户的逻辑日历(logical calendar)
    
    [calendar setFirstWeekday:2]; //  设定每月的第一天从星期几开始,比如:. 如需设定从星期日开始,则value传入1 ,如需设定从星期一开始,则value传入2 ,以此类推
    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]; // 这个月第一天在当前日历的顺序
    // 返回某个特定时间(date)其对应的小的时间单元(smaller)在大的时间单元(larger)中的顺序
    return firstWeekday - 1;
}
// 计算某月一共有多少天
- (NSInteger)totaldaysInMonth:(NSDate *)date{
    NSRange daysInOfMonth = [[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date]; // 返回某个特定时间(date)其对应的小的时间单元(smaller)在大的时间单元(larger)中的范围
    
    return daysInOfMonth.length;
}
// 日历的上一个月
- (NSDate *)lastMonth:(NSDate *)date{
    NSDateComponents *comp = [[NSDateComponents alloc]init];
    comp.month = -1;
    NSDate *newDate = [[NSCalendar currentCalendar] dateByAddingComponents:comp toDate:date options:0];
    return newDate;
}
// 日历的下一个月
- (NSDate *)nextMonth:(NSDate *)date{
    NSDateComponents *comp = [[NSDateComponents alloc]init];
    comp.month = 1;
    NSDate *newDate = [[NSCalendar currentCalendar] dateByAddingComponents:comp toDate:date options:0];
    return newDate;
}
#pragma mark - 日期处理方法(附加)
// 处理日期的上一日下一日
- (void)processingDateWithType:(NSInteger)type {
    // type  1为下一日    -1为上一日
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDateComponents *adComps = [[NSDateComponents alloc] init];
    [adComps setDay:type];
    _currentDate = [calendar dateByAddingComponents:adComps toDate:_currentDate options:0];
    
    self.dateLabel.text = [_currentDate stringWithDateFormatter:@"yyyy.MM.dd"];
}
// 判断是不是当天
- (BOOL)isSameDay:(NSDate*)date1 date2:(NSDate*)date2
{
    NSCalendar* calendar = [NSCalendar currentCalendar];
    
    unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth |  NSCalendarUnitDay;
    NSDateComponents* comp1 = [calendar components:unitFlags fromDate:date1];
    NSDateComponents* comp2 = [calendar components:unitFlags fromDate:date2];
    
    return [comp1 day]   == [comp2 day] &&
    [comp1 month] == [comp2 month] &&
    [comp1 year]  == [comp2 year];
}

相关文章

  • iOS开发日历

    由于工作需求自己写了一个日历, 大概思路是: 通过collectionView来做, 具备上一月下一月的切换, 日...

  • iOS之日历开发

    我们都知道,ios没有日历控件,要想在项目中加入日历功能,就得自己开发。github上面也有很多大神封装好的日历控...

  • 自定义iOS日历选取控件(链接) 8款iOS的日历开源代码

    iOS日历选取控件 IOS 8款iOS的日历开源代码

  • 纯swift实现日历Demo

    开发中安卓和ios日历弹出格式不一样,所以产品就提出个需求 ios 能做成安卓的日历样子吗? (小编表示默默不说话...

  • iOS开发之日历插件开发(Swift)

    效果图 0x01 如何获取目前日期 关于日期,苹果给出了 Date 类,初始化一个 Date 类 打印出来就是当前...

  • iOS 14 widget(时钟、日历)

    github demo 附在结尾 本文主要介绍iOS14 widget开发,自定义时钟、日历,app中切换widg...

  • iOS日历、日期、时间的计算

    时间和日历的计算在iOS开发中经常看到,经常看到大家在百度,开源中国等搜索这些答案。今天写个简单的时间和日历有关的...

  • iOS开发优秀博客和软件推荐

    iOSBlogAndTools iOS开发优秀博客和软件推荐 iOS开发中文博客 iOS开发工具 iOS开发网站 ...

  • iOS开发之创建框架

    在本教程中,您将在iOS 中为创建自定义日历控件中的开发人员的日历控件提取到一个单独的可重用框架中。在过程中,您将...

  • 2018-12-21

    iOS日历显示农历信息 - 简书

网友评论

      本文标题:iOS开发日历

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