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;
}
这里面是我添加的假数据,可以通过日历自定义事件.大家又不清楚的可以找我;
- iOS 定制日历
- iOS日历
- IOS日历
- iOS 日历
- iOS 日历
- iOS 日历
- Python 快速定制 Web 日历
- android日历MaterialCalendarView的定制开发
- Android实现高定制化日历控件
- Android一款可定制的日历控件
- ExtJs定制日历控件——定制部分解析
- ios 日历事件
- ios 日历 提醒
- iphone ios 日历
- IOS添加日历事件
- IOS 日历相关开发
- ios 精简日历
- IOS--日历的使用
- c++新技能不断get中
- Maven理解与使用
- linux设备树dts移植详解 .
- AFNetworking 简介和使用
- KMP算法
- iOS 定制日历
- 地鼠游戏---贪心
- bug统计分析续(一)基于SQL的Bug统计方法
- 关于泛型的一点理解
- dev 根据datatable动态生成gridview
- 对宁城哈哈一笑,很是真诚的抱拳说道。
- codeforces 520B Two Buttons[记忆化搜索]
- 使用while循环的注意事项:
- 气象业务系统切换国际标准时间