iOS 定制日历

来源:互联网 发布:淘宝店铺如何激活 编辑:程序博客网 时间:2024/06/06 09:15

1.开发过程

2.感言



   由于app的需要,我们需要在app上放上一个定制的日历,开始以为很好解决,在网上看了许多demo,都不理想,为此焦头烂额了几天(一直在研究),最后终于决定自己写一个,压力好大 啊.下面我来说一下我坐日历的思路(算是取巧);

    xcode为我们提供了三个方法,我们可以通过此方法来获取当前的月份的长度,还可以获取当前月的第一天是星期几,日历的话我们必须确定具体的星期(系统时间的话打印出来的会和实际的差8个小时,后面我会粘出来)

  获取了系统的时间之后,根据系统自带的api获取本月天数和每月第一天的星期数,本月日历表建好,下个月的话,我会去处理本地时间,里面的月份+1,这样就可以获取下个月的日历了(本人测试可行),依次类推,就完成了一个无限的日历表了.下面上代码;



@interface LooKForProjectViewController ()
{
    NSCalendar *myCalendar;
    NSRange monthRange;
    int     currentDayIndexOfMonth;
    int     firstDayIndexOfWeek;
    UIScrollView * scroll;
    int      monthCount;//月份;
    UILabel * year_label;//显示年份;
    UIView * date_view;//日历背景图;
    NSString * myNewDate_str;//取处理完成之后的时间字符串;
    
}
@end

@implementation LooKForProjectViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
     scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
    scroll.contentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height + 5);
    scroll.backgroundColor = MY_GROUND_COLOR;
    scroll.showsVerticalScrollIndicator = NO;
    [self.view addSubview:scroll];
    year_label = [[UILabel alloc]initWithFrame:CGRectMake(([[UIScreen mainScreen]bounds].size.width - 100)/2, 10, 100, 20)];
    [scroll addSubview:year_label];
    
    
    //下个月
    UIButton * next_month_button = [UIButton buttonWithType:UIButtonTypeSystem];
    next_month_button.frame = CGRectMake(220 , 10, 50, 20);
    [next_month_button setTitle:@"下个月" forState:UIControlStateNormal];
    [next_month_button addTarget:self action:@selector(showTheNextMonth:) forControlEvents:UIControlEventTouchUpInside];
    [scroll addSubview:next_month_button];
    
    //初始化日历;设置为公历;
    myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    //设置每周的第一天从星期几开始(1是周日,2是周一)
    [myCalendar setFirstWeekday:1];
    //设置每个月或者每年的第一周必须包含的最少天数  设置为1 就是第一周至少要有一天
    [myCalendar setMinimumDaysInFirstWeek:1];
    //设置时区,不设置时区获取月的第一天和星期的第一天的时候可能会提前一天。
    [myCalendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    [self checkTheMonthNumber:3];//默认进入的是当前月份;
    
    
    for (int i = 0 ; i < 7; i++) {
        UILabel * week_label = [[UILabel alloc]init];
        week_label.backgroundColor = [UIColor yellowColor];
        week_label.frame = CGRectMake(15 + 40 *(i%7), 40, 30, 15);
        if (i == 0 ) {
            week_label.text = @"日";
        }else if (i == 1){
            week_label.text = @"一";
        }else if (i == 2){
            week_label.text = @"二";
        }else if (i == 3){
            week_label.text = @"三";
        }else if (i == 4){
            week_label.text = @"四";
        }else if (i == 5){
            week_label.text = @"五";
        }else if (i == 6){
            week_label.text = @"六";
        }[scroll addSubview:week_label];

    }
}
//转化时区;
- (NSDate *)changeDate:(int)monthCount2

{
    
    NSDateFormatter * df = [[NSDateFormatter alloc]init];
    [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSString * s1 = [df stringFromDate:[NSDate date]];
    int now_year = [[s1 substringWithRange:NSMakeRange(2, 2)] intValue];
    NSString * year_str = [s1 stringByReplacingCharactersInRange:NSMakeRange(2, 2) withString:[NSString stringWithFormat:@"%d", (monthCount2 - 1)/12+ now_year]];
     //处理一下月份信息;
    //加一个判断,查看是否过了12月份;
    if (monthCount2 > 12) {
        monthCount2 = monthCount2%12;
        if (monthCount2 == 0) {
            monthCount2 = 12;
            
        }
        
    }
    NSString * next_year_str;
    next_year_str = [year_str stringByReplacingCharactersInRange:NSMakeRange(6, 1) withString:[NSString stringWithFormat:@"%d",monthCount2]];
    myNewDate_str = next_year_str;
    //处理点击之后月份转变的字符串;
    
    NSDate * my_date = [df dateFromString:next_year_str];
    
    NSTimeZone *zone = [NSTimeZone systemTimeZone];
    
    NSInteger interval = [zone secondsFromGMTForDate: my_date];
    
    NSDate *localeDate = [my_date  dateByAddingTimeInterval: interval];
    
    NSLog(@"%@", localeDate);
    return localeDate;
    
    
}
- (void)checkTheMonthNumber:(int)month2
{
    //默认进入的当前时间的;
    NSDate * beijing_date = [self changeDate:month2];
    //显示年份
    //取出处理后的年份和月份;
    NSString * the_year_str = [myNewDate_str substringWithRange:NSMakeRange(0, 4)];
    NSString * the_month_str = [myNewDate_str substringWithRange:NSMakeRange(6, [myNewDate_str length] - 18)];
    year_label.text = [NSString stringWithFormat:@"%@年%@月",the_year_str,the_month_str];
    NSLog(@"%@",year_label.text);
    [self calenderSetDate:beijing_date];
    
}
- (void)calenderSetDate:(NSDate *)date
{
    monthRange = [myCalendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:date];
    NSLog(@"%lu,%lulu",(unsigned long)monthRange.location,(unsigned long)monthRange.length);
    //获取date在其所在的月份的位置
    currentDayIndexOfMonth = [myCalendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:date];
    NSLog(@"当前天数%d",currentDayIndexOfMonth);
    
    NSTimeInterval interval;
    NSDate * firstDayMonth;
    //如果firstDayOfMonth和interval可计算,下边这个方法会返回YES,并且由firstDayOfMonth可得到date所在的设置的时间段(NSMonthCalendarUnit)里的第一天
    if ([myCalendar rangeOfUnit:NSMonthCalendarUnit startDate:&firstDayMonth interval:&interval forDate:date]) {
        NSLog(@"%@",firstDayMonth);
        NSLog(@"%f",interval);
    }
    firstDayIndexOfWeek = [myCalendar ordinalityOfUnit:NSDayCalendarUnit inUnit:NSWeekCalendarUnit forDate:firstDayMonth];
    [self drawBtn];
    
    
}
- (void)drawBtn
{
    date_view = [[UIView alloc]initWithFrame:CGRectMake(0, 80, [[UIScreen mainScreen]bounds].size.width, 300)];
    date_view.backgroundColor = [UIColor yellowColor];
    [scroll addSubview:date_view];
    NSArray * date_array = [self getTheMessageOfDays];
    for (int j = 0; j < [date_array count]; j ++) {
        NSNumber * date_number = [date_array objectAtIndex:j];
        for (int i = firstDayIndexOfWeek - 1; i < monthRange.length + firstDayIndexOfWeek - 1; i++) {
            UIButton * item_btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
            item_btn.frame = CGRectMake(5 + 40 * (i%7), 70 + 40 * (i/7), 30, 20);
            item_btn.tag = i + 2 - firstDayIndexOfWeek;
            
            [item_btn setTitle:[NSString stringWithFormat:@"%d",i + 2 - firstDayIndexOfWeek] forState:UIControlStateNormal];
            [item_btn addTarget:self action:@selector(choseTheButton:) forControlEvents:UIControlEventTouchUpInside];
            
            
            [date_view addSubview:item_btn];
            
            if ([date_number intValue] == i + 2 - firstDayIndexOfWeek) {
                item_btn.backgroundColor = [UIColor cyanColor];
                
                
            }else{
                NSLog(@"+++");
            }
        
        
        
        
        
        
        
    }
    
    


    

  }
    
    
    
    
}
- (void)choseTheButton:(UIButton *)btn
{
    NSLog(@"%d",btn.tag);
    NSArray * date_array = [self getTheMessageOfDays];
    for ( int i = 0; i < [date_array count]; i++) {
        NSNumber * date_number = [date_array objectAtIndex:i];
        if (btn.tag == [date_number intValue]) {
            NSLog(@"%d",btn.tag);
            UILabel * show_label = [[UILabel alloc]initWithFrame:CGRectMake(0, 400, [[UIScreen mainScreen]bounds].size.width, 30)];
            show_label.text = @"本期回款1000万";
            NSLog(@"frame%@",NSStringFromCGRect(show_label.frame));
            show_label.backgroundColor = [UIColor redColor];
            [scroll addSubview:show_label];
            
        }
        
        
        
        
  }
//    UILabel * show_label = [[UILabel alloc]initWithFrame:CGRectMake(0, [[UIScreen mainScreen]bounds].size.height - 40, [[UIScreen mainScreen]bounds].size.width, 30)];
//    show_label.text = @"本期回款1000万";
//    NSLog(@"frame%@",NSStringFromCGRect(show_label.frame));
//    show_label.backgroundColor = [UIColor redColor];
//    [scroll addSubview:show_label];
}
//查看下个月选项;
- (void)showTheNextMonth:(UIButton *)btn
{
    //添加一个计数器;
    monthCount++;
    [date_view removeFromSuperview];
    [self checkTheMonthNumber:3 + monthCount];
    
}
//请求的数据源;
- (NSArray *)getTheMessageOfDays
{
    NSArray * back_day = @[@1,@3,@5,@26];
    return back_day;
}

这里面是我添加的假数据,可以通过日历自定义事件.大家又不清楚的可以找我;


虽然完成了要求,但我知道这不是最完善的代码,取巧成分很大,开发时间略短,无法增加时间,先写到这里,希望对大家会有帮助
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 被金丝熊咬了怎么办 a字裙子没有内衬怎么办 踩过蟑螂的鞋子怎么办 宝宝给蚂蚁咬了怎么办 脚被蚂蚁咬肿了怎么办 孩子被蚂蚁咬了怎么办 家住高层有老鼠怎么办 久看手机眼睛疼怎么办 晚睡眼睛疼了怎么办 眼睛肿了有点痛怎么办 眼角两边长痘痘怎么办 坐动车行李超重怎么办 海康威视黑屏了怎么办 备孕喝酒抽烟了怎么办 鼻炎鼻子不通气怎么办速效办法 2岁宝宝智力落后怎么办 六个月宝宝尖足怎么办 3个月宝宝尖足怎么办 2岁宝宝发育慢怎么办 2岁宝宝便秘怎么办呀 2岁宝宝老是便秘怎么办 宝宝4岁不说话怎么办 宜家柜子味道重怎么办 家里有小飞虫怎么办呀 汽车里进老鼠了怎么办 老鼠跑到车里了怎么办 我的小车有老鼠怎么办 车里面进了老鼠怎么办 街电充电宝丢了怎么办 充电宝充不了电怎么办 脚裸扭伤肿了怎么办 大货车电瓶亏电怎么办 货车电瓶被偷了怎么办 小乌龟尾巴断了怎么办 长青春痘怎么办简单小妙招 一关灯就有蚊子怎么办 狗狗误食蟑螂药怎么办 泰迪误食蟑螂药怎么办 猫咪吃了蟑螂药怎么办 狗把蟑螂药吃了怎么办 猫吃了蟑螂诱饵怎么办