TapkuLibraryを使ってiPhoneカレンダーアプリを作ってみる

仙台iOS開発者勉強会にてTapkuLibraryの紹介を行いました。



このライブラリは色々な便利なカバーフローやグラフ、プログレスアラート等のViewの部品の集合なのですが、目玉としてはなんといってもiPhoneのカレンダーチックな綺麗なMonthCalendarだと思います。
多少の癖はあるのですが、まあ良く出来てると思います。

今回はiPhoneカレンダーアプリを真似て、EventKitを使ってiPhoneに登録された予定を表示させるのをライブコーディングにて行いました。基本的にはuniversaldemoに入っているDemoCalendarMonthのコードをコピって変更して作りました。

universaldemoではランダムでデータが生成されるようになっているので、ここでEventKitのEKEventStoreからイベントを拾って、データを作成するように変更します。
具体的には、TapkuTestViewController#generateRandomDataForStartDate:endDate: の箇所を修正しています。


TapkuTestViewController.m

- (void) generateRandomDataForStartDate:(NSDate*)start endDate:(NSDate*)end{
    EKEventStore *eventStore = [[[EKEventStore alloc] init] autorelease];
    EKCalendar *cal = [eventStore defaultCalendarForNewEvents];

    NSPredicate *p = [eventStore predicateForEventsWithStartDate:start endDate:end calendars:[NSArray arrayWithObject:cal]];
    NSArray *events = [eventStore eventsMatchingPredicate:p];
	
	self.dataArray = [NSMutableArray array];
	self.dataDictionary = [NSMutableDictionary dictionary];
	
	NSDate *d = start;
	while(YES){
		
        BOOL exist = NO;
        for (EKEvent *e in events) {
            if ([d isSameDay:e.startDate]) {
                
                NSMutableArray *array = [self.dataDictionary objectForKey:d];
                if (!array) {
                    array = [NSMutableArray array];
                }
                [self.dataDictionary setObject:array forKey:d];
                [array addObject:e.title];
                exist = YES;
            }
        }
        [self.dataArray addObject:[NSNumber numberWithBool:exist]];
        
//		int r = arc4random();
//		if(r % 3==1){
//			[self.dataDictionary setObject:[NSArray arrayWithObjects:@"Item one",@"Item two",nil] forKey:d];
//			[self.dataArray addObject:[NSNumber numberWithBool:YES]];
//			
//		}else if(r%4==1){
//			[self.dataDictionary setObject:[NSArray arrayWithObjects:@"Item one",nil] forKey:d];
//			[self.dataArray addObject:[NSNumber numberWithBool:YES]];
//			
//		}else
//			[self.dataArray addObject:[NSNumber numberWithBool:NO]];
		
		
		TKDateInformation info = [d dateInformationWithTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
		info.day++;
		d = [NSDate dateFromDateInformation:info timeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
		if([d compare:end]==NSOrderedDescending) break;
	}
	
}


こんな感じになりました。
今回は時間がなかったのでEKEventStoreを参照してなんとなく表示しただけのものになります。


尚、EKEventStore等を扱うためにはEventKit.frameworkの追加が必須となります。
勉強会で使用したソースはgithubからダウンロードできます。


カレンダーを自前で作るには相当な労力がかかると思いますのでこういうライブラリは助かりますね。標準のiOS SDKにカレンダーUIが追加されれば何の問題もないのですが・・・。