zoukankan      html  css  js  c++  java
  • FSCalendar使用和注意事项

    相信大家项目中或多或少都有日历这一块的内容吧,公司作为教育行业的软件公司,当然也是一定有的.

    最近被日历这一块的内容弄得很头疼啊,改来改去的,不过还是学到了很多东西,至少FSCalendar的使用基本还是熟悉了很多...

    1.下面记录一下:

    - (FSCalendar *)calendar {
        if (!_calendar) {
            //日历控件初始化
            _calendar = [[FSCalendar alloc] init];
    // 设置代理
    _calendar.
    delegate = self; _calendar.dataSource = self; _calendar.firstWeekday = 2; //设置周一为第一天 _calendar.appearance.weekdayTextColor = [UIColor blackColor]; _calendar.appearance.weekdayFont = FONT_18; _calendar.appearance.headerTitleColor = [UIColor darkGrayColor]; _calendar.appearance.titleDefaultColor = [UIColor darkGrayColor]; _calendar.appearance.titleFont = FONT_18; // _calendar.appearance.subtitleDefaultColor = [UIColor greenColor]; _calendar.appearance.eventDefaultColor = [UIColor lightGrayColor]; _calendar.appearance.eventSelectionColor = [UIColor lightGrayColor]; _calendar.appearance.selectionColor = [UIColor redColor]; _calendar.appearance.headerDateFormat = @"yyyy年MM月"; _calendar.appearance.todayColor = [UIColor clearColor]; _calendar.appearance.titleTodayColor = [UIColor lightGrayColor]; _calendar.appearance.borderRadius = 1.0; // 设置当前选择是圆形,0.0是正方形 _calendar.appearance.headerMinimumDissolvedAlpha = 0.0; _calendar.backgroundColor = [UIColor whiteColor]; NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];//设置为中文 _calendar.locale = locale; // 设置周次是中文显示 // _calendar.headerHeight = 0.0f; // 当不显示头的时候设置 _calendar.appearance.caseOptions = FSCalendarCaseOptionsWeekdayUsesSingleUpperCase; // 设置周次为一,二 [_calendar selectDate:[NSDate date]]; // 设置默认选中日期是今天 // 设置不能翻页 // _calendar.pagingEnabled = NO; // _calendar.scrollEnabled = NO; _calendar.placeholderType = FSCalendarPlaceholderTypeFillHeadTail; //月份模式时,只显示当前月份 } return _calendar; }
    placeholderType属性需要特别提一下: 这个是月份模式时,只显示当前月份,以前不知道这个属性,因为框架没有更新,测试提出需要不展示六行,日历只需要展示五行.

    2.下面介绍下我项目中用到的calendar的代理方法:
    #pragma mark - FSCalendarDelegate
    
    // 设置五行显示时的calendar布局
    - (void)calendar:(FSCalendar *)calendar boundingRectWillChange:(CGRect)bounds animated:(BOOL)animated {
        [UIView animateWithDuration:.3 animations:^{
            calendar.frame = (CGRect){calendar.frame.origin,bounds.size};
            self.myTableView.frame = CGRectMake(0, 0, K_SCREEN_WIDTH, K_SCREEN_HEIGHT);
            ScheduleHeaderView *headerView = (ScheduleHeaderView *)[self.myTableView headerViewForSection:0];
            headerView.frame = calendar.frame;
            [self.myTableView reloadData];
        } completion:^(BOOL finished) {
        }];
        NSLog(@"0---%f",calendar.frame.origin.y);
        NSLog(@"0---%f",self.myTableView.frame.origin.y);
    }
    
    // 对有事件的显示一个点,默认是显示三个点
    - (NSInteger)calendar:(FSCalendar *)calendar numberOfEventsForDate:(NSDate *)date
    {
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        dateFormatter.dateFormat = @"yyyy-MM-dd";
        if ([self.datesWithEvent containsObject:[dateFormatter stringFromDate:date]]) {
            return 1;
        }
        return 0;
    }
    
    - (void)calendarCurrentPageDidChange:(FSCalendar *)calendar {
        
        NSLog(@"calendar.currentPage--  %@",calendar.currentPage);
        //日历翻页时记录第一天
    //    NSDate *changeDate = [calendar tomorrowOfDate:calendar.currentPage];
        NSDate *changeDate = calendar.currentPage;
        dateStr = [calendar stringFromDate:changeDate format:@"yyyyMMdd"];
        //有事件的日期的年和月
        NSDateFormatter *formatterYearAndMonth = [[NSDateFormatter alloc] init];
        formatterYearAndMonth.dateFormat = @"yyyy-MM";
        dateYearAndMonthStr = [formatterYearAndMonth stringFromDate:changeDate];
        // 当日
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        formatter.dateFormat = @"yyyy-MM-dd";
        NSString *todayDateYearAndMonthStr = [formatterYearAndMonth stringFromDate: [NSDate date]];
        // 设置切换到当前月份的时候,显示的是当天的日程
        if ([[dateYearAndMonthStr substringWithRange:NSMakeRange(5, 2)] isEqualToString:[todayDateYearAndMonthStr substringWithRange:NSMakeRange(5, 2)]]) {
            dateStr = [calendar stringFromDate:[NSDate date] format:@"yyyyMMdd"];
        }
        [self loadData];
    }
    
    - (void)calendar:(FSCalendar *)calendar didSelectDate:(NSDate *)date {
        NSLog(@"did select date %@",[calendar stringFromDate:date format:@"yyyy/MM/dd"]);
        dateStr = [calendar stringFromDate:date format:@"yyyyMMdd"];
        NSLog(@"---%@",dateStr);
        [self loadData];
    }
    
    - (BOOL)calendar:(FSCalendar *)calendar hasEventForDate:(NSDate *)date{
    
        return [_datesWithEvent containsObject:[calendar stringFromDate:date format:@"yyyy-MM-dd"]];
    }

    3.刚开始项目中直接将Calendar作为表视图的头视图,经过测试发现每次切换月份的时候因为改变的calendar的实际高度(因为每月不一定显示是五行或者是六行),再刷新表视图会导致表视图会"闪跳"现象,后面直接将calendar作为表视图的第一个section的headerView就解决了.

    #pragma mark - UITableViewDataSource
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        
        return 2;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        
        return section == 0 ? 0 : self.dataArray.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        
        if (indexPath.section == 1) {
            ScheduleCell *cell = [tableView dequeueReusableCellWithIdentifier:MyScheduleCellIdentify forIndexPath:indexPath];
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
            if (self.dataArray.count > 0) {
                cell.myApplyModel = self.dataArray[indexPath.row];
            }
            return cell;
        } else {
            return nil;
        }
    }
    
    #pragma mark - UITableViewDelegate
    
    - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
        
        if (section == 0) {
            UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, K_SCREEN_WIDTH, 300)];
            [view addSubview:self.calendar];
            self.calendar.frame = CGRectMake(0, 0, K_SCREEN_WIDTH, 300);
            return view;
        } else {
            ScheduleHeaderView *sectionHeaderView = [[ScheduleHeaderView alloc]initWithFrame:CGRectMake(0, 0, K_SCREEN_WIDTH, 44)];
            sectionHeaderView.titleLabel.text = @"今日会议";
            sectionHeaderView.titleLabel.font = FONT_18;
            sectionHeaderView.badgeLabel.text = [NSString stringWithFormat:@"%ld",(unsigned long)self.dataArray.count];
            return sectionHeaderView;
        }
        return nil;
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
        
        if (section == 0) {
            return self.calendar.frame.size.height ? : 300;
        } else {
            
            return 44;
        }
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
        return 0.001f;
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        if (indexPath.section == 1) {
            return [tableView fd_heightForCellWithIdentifier:MyScheduleCellIdentify configuration:^(ScheduleCell *cell) {
                cell.myApplyModel = self.dataArray[indexPath.row];
            }];
        } else {
            return 0;
        }
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
        
    }

    总结:

    1.刚开始觉得一个Calendar展示没啥问题,毕竟有成熟的第三方FSCalendar嘛,实际动手才发现很多问题需要注意;

    2.完成项目的一个功能的时候,不要想着有第三方的支持,直接用就好了,实际上还是要多看看作者的demo,熟悉框架的实现才能很好的用到项目中;

    3.遇到问题,多想想可能造成的原因,多尝试用不同的方法实现,说不定就解决了当前的bug问题.

    4.空闲时间还是要多学学优秀的第三方框架,不能只停留在用的层面,想想实现和调用的原理,为什么要这个属性,为什么要实现这个方法,为什么要调用这个代理.

    多学习,爱学习的孩纸运气不会太差,加油!!

  • 相关阅读:
    react创建项目01
    jq中的时间转化
    vue-resource调用promise取数据方式整理
    ES6 语法
    js获取时间
    trigger()模拟事件操作
    移动端调出不同需求的键盘
    移动端ios滚动卡顿问题
    godaddy购买的域名解析到aws的route53
    k8s 排错
  • 原文地址:https://www.cnblogs.com/pengsi/p/6512996.html
Copyright © 2011-2022 走看看