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 in google. But, i can't find the exact solution for my problem. Can anyone please help to use the Calendar view for UIDatePicker? Thanks in advance.
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
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
来源:https://stackoverflow.com/questions/8940875/how-to-show-calendar-instead-of-using-uidatepicker-in-iphone