Как показать календарь вместо использования UIDatePicker в iPhone? - PullRequest
3 голосов
/ 20 января 2012

Я использую контроллер UIDatePicker для выбора даты в приложении iPhone.Теперь я хочу показать представление календаря вместо контроллера UIDatePicker.Я искал свой уровень лучше всего в Google.Но я не могу найти точное решение для моей проблемы.Может кто-нибудь, пожалуйста, помогите использовать представление календаря для UIDatePicker?Заранее спасибо.

Ответы [ 2 ]

9 голосов
/ 20 января 2012

Лучше всего использовать один из следующих вариантов -

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

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

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

Не существует готового решения, которое конвертирует UIDatePicker в представление календаря

1 голос
/ 02 июня 2015

Создайте вид коллекции и используйте эту ячейку для отображения календаря.

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
...