美文网首页程序员
iOS自定义日历控件

iOS自定义日历控件

作者: i_苏 | 来源:发表于2018-05-08 16:17 被阅读0次

    在我们开发的过程中,难免会遇到一些自定义系统控件的问题,不要发愁,把它当做一个游戏来做就可以了!!

    不说废话,开始上代码了!!!!!


    首先,这里使用的是view来进行自定义日历的,主要使用的UICollectionView控件

    1、声明文件,在.h中定义代码块,往vc中传值使用

    #import

    typedefvoid(^selectDate)(NSString*selectedDate);

    @interfaceDBSelectedCalenderView :UIView

    @property(nonatomic,copy) selectDate date;

    @end

    2、接下来就是主要的.m中的实现了(做好准备了吗?)

    #import "DBSelectedCalenderView.h"

    #import "DBCalenderCollectionViewCell.h"        //单元格

    @interface DBSelectedCalenderView()

    @property(nonatomic,strong) UILabel *today;

    @property(nonatomic,strong)UICollectionView*calenderCollectionView;

    @property(nonatomic,strong) UICollectionViewFlowLayout *layout;

    @end

    #define cellWidth30        //单元格宽高

    #define margin ([UIScreen mainScreen].bounds.size.width - cellWidth *7) /8    //间距

    @implementationDBSelectedCalenderView

    -(instancetype)initWithFrame:(CGRect)frame{

        if(self= [superinitWithFrame:frame]) {

            self.backgroundColor = [UIColor whiteColor];

            [selfaddSubview:self.today];

            [self addSubview:self.calenderCollectionView];

            UIView *vi = [[UIView alloc]init];

            vi.backgroundColor = [UIColor groupTableViewBackgroundColor];

            [selfaddSubview:vi];

            vi.sd_layout.topSpaceToView(self.calenderCollectionView, margin).leftSpaceToView(self, 0).rightSpaceToView(self, 0).bottomSpaceToView(self, 0);

            // 注册collectionViewcell:WWCollectionViewCell是我自定义的cell的类型

            [self.calenderCollectionView registerClass:[DBCalenderCollectionViewCell class] forCellWithReuseIdentifier:@"DBCalenderCollectionViewCell"];

            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

            [formattersetDateFormat:@"dd"];

            NSInteger nowDay = [[formatter stringFromDate:[NSDate date]] integerValue];

            [_calenderCollectionView selectItemAtIndexPath:[NSIndexPath indexPathForItem:nowDay - 1 inSection:0] animated:YES scrollPosition:UICollectionViewScrollPositionNone];

            [self.calenderCollectionView reloadData];

        }

        return self;

    }

    -(NSInteger)numberOfSectionsInCollectionView:(UICollectionView*)collectionView{

        return 1;

    }

    -(NSInteger)collectionView:(UICollectionView*)collectionView numberOfItemsInSection:(NSInteger)section{

        return [self getNumberOfDaysInMonth];

    }

    -(UICollectionViewCell*)collectionView:(UICollectionView*)collectionView cellForItemAtIndexPath:(NSIndexPath*)indexPath{

        DBCalenderCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"DBCalenderCollectionViewCell" forIndexPath:indexPath];

        cell.layer.masksToBounds = YES;

        cell.layer.cornerRadius = 4;

        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

        [formattersetDateFormat:@"dd"];

        NSInteger nowDay = [[formatter stringFromDate:[NSDate date]] integerValue];

        NSIndexPath *inde = [NSIndexPath indexPathForItem:nowDay - 1 inSection:0];

        DBCalenderCollectionViewCell *defaultCell = (DBCalenderCollectionViewCell *)[collectionView cellForItemAtIndexPath:inde];

    //    defaultCell.backgroundColor = [UIColor yellowColor];

        defaultCell.layer.borderColor = HTitColor.CGColor;

        defaultCell.layer.borderWidth=1;

        cell.nowDay.text= [NSStringstringWithFormat:@"%ld",indexPath.row+1];

        returncell;

    }

    -(void)collectionView:(UICollectionView*)collectionView didSelectItemAtIndexPath:(NSIndexPath*)indexPath{

        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

        [formattersetDateFormat:@"dd"];

        NSInteger nowDay = [[formatter stringFromDate:[NSDate date]] integerValue];

        NSIndexPath *inde = [NSIndexPath indexPathForItem:nowDay - 1 inSection:0];

        DBCalenderCollectionViewCell *defaultCell = (DBCalenderCollectionViewCell *)[collectionView cellForItemAtIndexPath:inde];

        defaultCell.layer.borderColor = [UIColor clearColor].CGColor;

        defaultCell.layer.borderWidth=1;

        DBCalenderCollectionViewCell *cell = (DBCalenderCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];

        cell.layer.borderColor = HTitColor.CGColor;

        cell.layer.borderWidth = 1;

        NSDateFormatter *formatterr = [[NSDateFormatter alloc] init];

        [formatterrsetDateFormat:@"yyyy-MM"];

        NSString*nowMonth = [formatterrstringFromDate:[NSDatedate]];

        NSString *str = [nowMonth stringByAppendingString:[NSString stringWithFormat:@"-%@",cell.nowDay.text]];

        NSLog(@"%@",str);

        if(self.date) {

            self.date(str);

        }

    }

    -(void)collectionView:(UICollectionView*)collectionView didDeselectItemAtIndexPath:(NSIndexPath*)indexPath{

        DBCalenderCollectionViewCell *cell = (DBCalenderCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];

        cell.layer.borderColor = [UIColor clearColor].CGColor;

        cell.layer.borderWidth = 1;

    }

    /** 每个cell的尺寸*/

    - (CGSize)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath*)indexPath{

        return CGSizeMake(cellWidth, cellWidth);

    }

    #pragma mark - setter and getter

    -(UILabel*)today{

        if(!_today) {

            _today = [[UILabel alloc]initWithFrame:CGRectMake(20, 20, self.frame.size.width - 20, 50)];

            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

            [formattersetDateFormat:@"yyyy-MM-dd"];

            NSDateFormatter *outputFormatter=[[NSDateFormatter alloc]init];

            [outputFormattersetDateFormat:@"EEEE-MMMM-d"];

            NSString*outputDateStr=[outputFormatterstringFromDate:[NSDatedate]];

            NSArray*weekArray=[outputDateStrcomponentsSeparatedByString:@"-"];

            _today.numberOfLines = 2;

            _today.text = [NSString stringWithFormat:@"%@\n%@",[formatter stringFromDate:[NSDate date]],[self cTransformFromE:[weekArray objectAtIndex:0]]];

        }

        return _today;

    }

    -(UICollectionView*)calenderCollectionView{

        if (!_calenderCollectionView) {

            _calenderCollectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(0, 70, self.frame.size.width, 150 + 5 * margin) collectionViewLayout:self.layout];

            _calenderCollectionView.delegate = self;

            _calenderCollectionView.dataSource = self;

            _calenderCollectionView.scrollEnabled = NO;

            _calenderCollectionView.backgroundColor = [UIColor whiteColor];

        }

        return _calenderCollectionView;

    }

    -(UICollectionViewFlowLayout *)layout{

        if(!_layout) {

            _layout = [[UICollectionViewFlowLayout alloc]init];

            _layout.itemSize = CGSizeMake(cellWidth, cellWidth);

            //四周边距

            _layout.sectionInset = UIEdgeInsetsMake(margin, margin, margin, margin);

            _layout.minimumInteritemSpacing = margin;

            _layout.minimumLineSpacing = margin;

            //设置滑动方向

            _layout.scrollDirection = UICollectionViewScrollDirectionVertical;

        }

        return _layout;

    }

    // 获取当月的天数

    - (NSInteger)getNumberOfDaysInMonth

    {

        NSCalendar * calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; // 指定日历的算法 NSGregorianCalendar - ios 8

        NSDate* currentDate = [NSDatedate];

        NSRange range = [calendar rangeOfUnit:NSCalendarUnitDay  //NSDayCalendarUnit - ios 8

                                       inUnit:NSCalendarUnitMonth//NSMonthCalendarUnit - ios 8

                                      forDate:currentDate];

        returnrange.length;

    }

    //转换英文为中文

    -(NSString*)cTransformFromE:(NSString*)theWeek{

        NSString*chinaStr;

        if(theWeek){

            if([theWeekisEqualToString:@"Monday"]){

                chinaStr =@"星期一";

            }elseif([theWeekisEqualToString:@"Tuesday"]){

                chinaStr =@"星期二";

            }elseif([theWeekisEqualToString:@"Wednesday"]){

                chinaStr =@"星期三";

            }elseif([theWeekisEqualToString:@"Thursday"]){

                chinaStr =@"星期四";

            }elseif([theWeekisEqualToString:@"Friday"]){

                chinaStr =@"星期五";

            }elseif([theWeekisEqualToString:@"Saturday"]){

                chinaStr =@"星期六";

            }elseif([theWeekisEqualToString:@"Sunday"]){

                chinaStr =@"星期日";

            }

        }

        returnchinaStr;

    }

    当然,还有主要的就是自定义单元格哦!!   小伙伴们一定不要忘记这致命的一点哦!!

    .h

    #import

    @interfaceDBCalenderCollectionViewCell :UICollectionViewCell

    @property(nonatomic,strong) UILabel *nowDay;

    @end

    .m

    #import "DBCalenderCollectionViewCell.h"

    @interface DBCalenderCollectionViewCell()

    @end

    @implementationDBCalenderCollectionViewCell

    -(instancetype)initWithFrame:(CGRect)frame{

        if(self= [superinitWithFrame:frame]) {

            [self.contentView addSubview:self.nowDay];

        }

        return self;

    }

    -(UILabel*)nowDay{

        if(!_nowDay) {

            _nowDay = [[UILabel alloc]initWithFrame:self.contentView.frame];

            _nowDay.textColor=HBgColor;

            _nowDay.textAlignment = NSTextAlignmentCenter;

        }

        return _nowDay;

    }

    @end

    OK,这样一个自定义日历控件就出来了,其实好多东西本身并不难,是我们自己想复杂了,把它当做游戏,那样会很有乐趣而且很有效果哦!!!!!!

    相关文章

      网友评论

        本文标题:iOS自定义日历控件

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