How to show Calendar instead of using UIDatePicker in iPhone?

前端 未结 2 994
悲哀的现实
悲哀的现实 2021-01-06 13:56

I am using UIDatePicker controller to choose the date in iPhone app. Now, i want to show the Calendar View instead of UIDatePicker Controller. I have searched my level best

相关标签:
2条回答
  • 2021-01-06 14:52

    Create a collectionview and user this cell to display calender.

    calenderCell.h

    #import <UIKit/UIKit.h>
    //#import "UIView+Alignment.h"
    //#import "UIView+Layout.h"
    
    @protocol CalendarCellDelegte <NSObject>
    - (void)updateSelectedDate:(NSDate*)date;
    @end
    
    
    @interface CalendarCell : UICollectionViewCell
    {
        NSMutableArray *labelArray;
        NSDateComponents *currentMonth;
        __weak id _delegate;
    }
    
    @property (nonatomic, weak) id delegate;
    @property(nonatomic, retain) NSCalendar *calendar;
    @property (atomic, strong) NSDate *firstDay;
    - (void)UpdateCalendarCell:(NSDateComponents*)month_ selectedDate:(NSDate*)selDate;
    
    @end
    

    calenderCell.m

    #import "CalendarCell.h"
    
    @implementation CalendarCell
    @synthesize calendar=_calendar;
    @synthesize delegate=_delegate;
    
    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code
            NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:@"CalendarCell" owner:self options:nil];
    
            if ([arrayOfViews count] < 1) {
                return nil;
            }
    
        if (![[arrayOfViews objectAtIndex:0] isKindOfClass:[UICollectionViewCell class]]) {
            return nil;
        }
    
        self = [arrayOfViews objectAtIndex:0];
        labelArray=[[NSMutableArray alloc]init];
        for (int i=0; i<5; i++)
        {
            for (int j=0; j<7; j++)
            {
                CGRect rect;
                rect=CGRectMake(((j*2)+2)+(j*44), (i*44), 42, 42);
    
              //  NSLog(@"%f",rect.origin.x);
                UIView *view=[[UIView alloc]initWithFrame:rect];
                [self addSubview:view];
                view.layer.cornerRadius=view.bounds.size.width/2;
                view.layer.borderColor=[UIColor clearColor].CGColor;
                view.layer.borderWidth=1;
    
    
                UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(actionTap:)];
                [view addGestureRecognizer:tapGestureRecognizer];
    
                view.backgroundColor=[UIColor redColor];
    
                rect=CGRectMake(6, 3, 30, 30);
    
                UILabel *label=[[UILabel alloc]initWithFrame:rect];
                label.backgroundColor=[UIColor greenColor];//UIColorFromRGB(0xd3d3d3);
                [view addSubview:label];
                label.textColor=[UIColor whiteColor];
                label.textAlignment=NSTextAlignmentCenter;
                label.userInteractionEnabled=NO;
                [labelArray addObject:label];
                label.layer.cornerRadius=15;
    
               // label.backgroundColor=[UIColor clearColor];UIColorFromRGB(0x6cc9ff);
            }
        }
        self.calendar=[NSCalendar currentCalendar];
    }
    return self;
    }
    
    
    - (void)UpdateCalendarCell:(NSDateComponents*)month_ selectedDate:(NSDate*)selDate
    {
        currentMonth=month_;
        currentMonth.day=1;
        [self setFirstDay:[currentMonth.calendar dateFromComponents:currentMonth]];
        int viewTag=1;
        NSInteger column = 7 - [self numberOfDaysInFirstWeek];
        int totalNumberOfDays=(int)[self numberOfDays];
    
        for (int i=0; i<5; i++)
        {
            for (int j=0; j<7; j++)
            {
                UILabel *label=(UILabel*)[labelArray objectAtIndex:viewTag-1];
                label.textColor=[UIColor whiteColor];
                label.backgroundColor=[UIColor clearColor];
                label.superview.backgroundColor=[UIColor clearColor];
                label.superview.layer.borderColor=[UIColor clearColor].CGColor;
    
                if((viewTag-column) <= 0)
                {
                    label.text=@"";
                    label.tag=0;
                    if(totalNumberOfDays+column > 35)
                    {
                        if(35- (column-viewTag) <= totalNumberOfDays)
                        {
                            label.text=[NSString stringWithFormat:@"%li",35- (column-viewTag)];
                            label.tag=35- (column-viewTag);
                            currentMonth.day=35- (column-viewTag);
                            NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:currentMonth];
                            NSDateComponents *otherDay = [[NSCalendar currentCalendar] components:NSEraCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:date];
                            if(selDate)
                            {
                                NSDateComponents *selectDate = [[NSCalendar currentCalendar] components:NSEraCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:selDate];
                                if([otherDay day] == [selectDate day] && [otherDay month] == [selectDate month] && [otherDay year] == [selectDate year] && [otherDay era] == [selectDate era])
                                {
                                    label.backgroundColor=[UIColor clearColor];
                                    label.superview.backgroundColor=[UIColor colorWithRed:23.0/255.0 green:154.0/255.0 blue:208.0/255.0 alpha:.5];//UIColorFromRGB(0x4DBDED);
                                    label.superview.layer.borderColor=[UIColor clearColor].CGColor;
                                }
                            }
                        }
                    }
                }
                else if((viewTag-column) > [self numberOfDays])
                {
                    label.text=[NSString stringWithFormat:@"%li",- ([self numberOfDays]- (viewTag-column))];
                    label.tag=0;
                    label.textColor=[UIColor lightGrayColor];
                }
                else
                {
    
                    label.text=[NSString stringWithFormat:@"%li",viewTag-column];
                    label.tag=viewTag-column;
                    currentMonth.day=viewTag-column;
                    NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:currentMonth];
                    NSDateComponents *otherDay = [[NSCalendar currentCalendar] components:NSEraCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:date];
                    NSDateComponents *today = [[NSCalendar currentCalendar] components:NSEraCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
                    if([today day] == [otherDay day] && [today month] == [otherDay month] && [today year] == [otherDay year] && [today era] == [otherDay era])
                    {
                        label.backgroundColor=[UIColor clearColor];//23 154 208
                        label.superview.backgroundColor=[UIColor redColor];
                        label.superview.layer.borderColor=[UIColor clearColor].CGColor;
                    }
                    if(selDate)
                    {
                        NSDateComponents *selectDate = [[NSCalendar currentCalendar] components:NSEraCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:selDate];
                        if([otherDay day] == [selectDate day] && [otherDay month] == [selectDate month] && [otherDay year] == [selectDate year] && [otherDay era] == [selectDate era])
                        {
                            label.backgroundColor=[UIColor clearColor];
                            label.superview.backgroundColor=[UIColor colorWithRed:23.0/255.0 green:154.0/255.0 blue:208.0/255.0 alpha:.5];
                            label.superview.layer.borderColor=[UIColor clearColor].CGColor;
                        }
                    }
                }
                viewTag++;
            }
        }
    }
    
    - (void)actionTap:(UITapGestureRecognizer*)tap
    {
        @try {
            UIView *view=(UIView*)tap.view;
            UILabel *label=(UILabel*)[view.subviews objectAtIndex:0];
    
            //if(currentMonth.day == label.tag)
            //    return;
            if(label.tag != 0)
            {
                currentMonth.day=label.tag;
                NSDate *selectedDate = [[NSCalendar currentCalendar] dateFromComponents:currentMonth];
                [_delegate updateSelectedDate:selectedDate];
            }
        }
        @catch (NSException *exception) {
            NSLog(@"%@",exception);
        }
    }
    
    #pragma mark - Helper methods
    
    - (NSInteger)numberOfWeeks {
        return [[self calendar] rangeOfUnit:NSDayCalendarUnit
                                     inUnit:NSWeekCalendarUnit
                                    forDate:[self firstDay]].length;
    }
    
    - (NSInteger)numberOfDays {
        return [[self calendar] rangeOfUnit:NSDayCalendarUnit
                                     inUnit:NSMonthCalendarUnit
                                    forDate:[self firstDay]].length;
    }
    
    - (NSInteger)numberOfDaysInFirstWeek {
        return [[self calendar] rangeOfUnit:NSDayCalendarUnit
                                     inUnit:NSWeekCalendarUnit
                                    forDate:[self firstDay]].length;
    }
    
    @end
    
    0 讨论(0)
  • 2021-01-06 15:00

    Your best bet is to use one of the following -

    1) https://github.com/guicocoa/calendar

    2) http://github.com/devinross/tapkulibrary

    3) http://github.com/klazuka/Kal

    There is no ready made solution which will convert UIDatePicker to calender view

    0 讨论(0)
提交回复
热议问题