NSCalendar 日历 简单实现

今天看了看 NSCalendar , 简单的写了写, 没有什么附加功能, 这里有 Demo, 方便理解调试.
LC_Calender.
代码都写在了 ViewController 里面, 下面给大家附一份。大家也可以直接复制到工程查看。不断学习, 如有错误之处, 敬请指正!

@interface ViewController ()
{
    NSCalendar *myCalendar;
    NSRange monthRange;
    NSInteger currentDayIndexOfMonth;
    int firstDayIndexOfWeek;
}
@end

@implementation ViewController

-(void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //初始化日历类,并设置日历类的格式是阳历 若想设置中国日历 设置为NSChineseCalendar
    myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    //设置每周的第一天从星期几开始  设置为 1 是周日,2是周一
    [myCalendar setFirstWeekday:1];
    //设置每个月或者每年的第一周必须包含的最少天数  设置为1 就是第一周至少要有一天
    [myCalendar setMinimumDaysInFirstWeek:1];
    //设置时区,不设置时区获取月的第一天和星期的第一天的时候可能会提前一天。
//    [myCalendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:0]];
    [myCalendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"0"]];
    //计算绘制日历需要的数据,我传入当前日期  输入月份或年不同的日期就能得到不同的日历。
    [self calendarSetDate:[NSDate date]];
    for (int i = 0; i < 7; i ++)
    {
        UILabel *label = [[UILabel alloc] init];
        label.frame = CGRectMake(50 + 40 * (i%7), 60, 30, 30);
        if (i == 0)
        {
            label.text = @"日";
        }
        else if (i == 1)
        {
            label.text = @"一";
        }
        else if (i == 2)
        {
            label.text = @"二";
        }
        else if (i == 3)
        {
            label.text = @"三";
        }
        else if (i == 4)
        {
            label.text = @"四";
        }
        else if (i == 5)
        {
            label.text = @"五";
        }
        else if (i == 6)
        {
            label.text = @"六";
        }
        label.backgroundColor = [UIColor blueColor];
        label.textColor = [UIColor whiteColor];
        label.textAlignment = 1;
        [self.view addSubview:label];
    }
}

-(void)calendarSetDate:(NSDate *)date
{
    /* 日历类里比较重要的三个方法
     -(NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;
     该方法计算date所在的larger单位  里有几个  smaller单位。
     例如smaller为NSDayCalendarUnit,larger为NSMonthCalendarUnit则返回的nsrange的length为date所在的月里共有多少天。
     
     -(NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date;
     该方法计算date 所在的smaller单位 在 date所在的larger单位 里的位置,即第几位。
     例如smaller为NSDayCalendarUnit,larger为NSMonthCalendarUnit则返回的 nsUInteger为date是date所在的月里的第几天。
     
     -(BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate *)datep interval:(NSTimeInterval )tip forDate:(NSDate *)date;
     若datep 和 tip 可计算,则方法返回YES,否则返回NO。当返回YES时,可从datep里得到date所在的 unit单位 的第一天。unit可以为 NSMonthCalendarUnit NSWeekCalendarUnit 等
     */
    //获取date所在的月的天数,即monthRange的length
//    monthRange = [myCalendar rangeOfUnit:NSDayCalendarUnit
//                                  inUnit:NSMonthCalendarUnit
//                                 forDate:date];
    monthRange = [myCalendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date];
    NSLog(@"monthRange:%ld,%ld",monthRange.location,monthRange.length);
    //获取date在其所在的月份里的位置
//    currentDayIndexOfMonth = [myCalendar ordinalityOfUnit:NSDayCalendarUnit
//                                                   inUnit:NSMonthCalendarUnit
//                                                  forDate:date] ;
    currentDayIndexOfMonth = [myCalendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date];
    NSLog(@"currentIndex:%ld",currentDayIndexOfMonth);
    
    NSTimeInterval interval;
    NSDate *firstDayOfMonth;
    //如果firstDayOfMonth和interval可计算,下边这个方法会返回YES,并且由firstDayOfMonth可得到date所在的设置的时间段(NSMonthCalendarUnit)里的第一天
    if ([myCalendar rangeOfUnit:NSCalendarUnitMonth startDate:&firstDayOfMonth interval:&interval forDate:date]) {
        NSLog(@"%@",firstDayOfMonth);
        NSLog(@"%f",interval);
    }
    //获取date所在月的第一天在其所在周的位置,即第几天。
    firstDayIndexOfWeek = [myCalendar ordinalityOfUnit:NSDayCalendarUnit
                                                inUnit:NSWeekCalendarUnit
                                               forDate:firstDayOfMonth];
//    firstDayIndexOfWeek = (int)[myCalendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitWeekday forDate:firstDayOfMonth];
    NSLog(@"---------------------------%d", firstDayIndexOfWeek);
    //画按钮
    [self drawBtn];  
}

-(void)drawBtn
{
    //为了方便计算按钮的frame,我的i没从0开始
    for (int i = firstDayIndexOfWeek - 1 ; i < monthRange.length + firstDayIndexOfWeek -1 ; i ++)
    {
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        btn.frame = CGRectMake(50 + 40 * (i%7), 100 + 40*(i/7), 30, 30);
        btn.tag = i + 2 - firstDayIndexOfWeek;
        btn.backgroundColor = [UIColor redColor];
        [btn setTitle:[NSString stringWithFormat:@"%d",i + 2 - firstDayIndexOfWeek ]
             forState:UIControlStateNormal];
        [btn addTarget:self
                action:@selector(nslogBtnTag:)
      forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:btn];      
    }
}
-(void)nslogBtnTag:(UIButton *)btn
{
    NSLog(@"%ld",btn.tag);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,515评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,029评论 4 62
  • 一眨眼,一年只剩下十二分之一了。你的余额充足吗?
    吉祥在路上阅读 357评论 0 4
  • 感赏 今天晚上朋友生日,去参加了,也能融入其中,发现没有像以前那样怯场了,许久不见的老同事说我皮肤越来越好,被人夸...
    郑家菇凉阅读 69评论 0 0
  • 漆黑的夜空中 挂着几颗亮星 犹如航塔上的灯 那光芒总是令我神往 四周寂静的夜 我看不清你的脸 我的爱人 远处突然发...
    大笑好不好阅读 505评论 0 2