日付ごとにデータを管理して表示するっていうことをしたくて
一般的なカレンダーのような表示をしたい…
ということで、自分で作ってみました。
きっとこれぐらいのものなら、ライブラリもいっぱい転がってるのでしょうけど、勉強がてら…
ある程度形になったので、いつもの様に?のっけてみる(笑)
ANZCalendar
普通のカレンダー(月単位の)表示を実現。
ソース
- ANZCalendar.h
- ANZCalendarCell.h
- ANZCalendarDataObject.h
- ANZCalendarMenuBar.h
- ANZCalendarNavigator.h
できること
- 左右のスワイプで表示月更新
- 各種色の変更
- フォント系の変更
- delegateによる各種タイミングでの処理
使い方
呼び出し
ANZCalendar* calendar = [[ANZCalendar alloc] initWithDisplayDate:[NSDate date]];
calendar.delegate = self;
[calendar show];
デリゲートでの処理
表示月切り替え
- (void)willRenewCalendarWithNewDate:(NSDate *)newDate
{
// newDateに切り替わった日付がくるので、
// そこから何か処理をするとか…持ってるデータの切り替えとか
NSLog(@"new date :%@", newDate);
}
日付を選択した場合
- (void)didSelectDay:(NSDateComponents *)dateComponents
{
// 選択した日付が返ってくるので、
// それに伴って処理を行う
NSLog(@"select day:%@", dateComponents);
}
特定日を強調
// 特定の日付を強調して表示したい場合
// 例えば内部で保持しているデータと日付がマッチしてたら…とか
- (BOOL)isStrongDayWithDateComponents:(NSDateComponents *)dateComponents
{
// YESをかえすと強調される
// attributesStrong系のプロパティで表示は変更可
// とりあえずの返し
return ([dateComponents day] % 6 == 0);
}
- (UIView *)accentStrongDayWithDateComponents:(NSDateComponents *)dateComponents cellSize:(CGSize)size
{
if ([dateComponents day] % 5 != 0) {
return nil;
}
// 何か自分で作って表示したい場合
// isStrongDayWithDateComponents:で対応できる感じでは物足りない場合?
UILabel* accent = [[UILabel alloc] initWithFrame:CGRectMake(0, size.height - 20, size.width, 20)];
accent.text = @"★";
accent.font = [UIFont systemFontOfSize:12.f];
accent.adjustsFontSizeToFitWidth = YES;
accent.backgroundColor = [UIColor clearColor];
accent.textColor = [UIColor purpleColor];
accent.textAlignment = NSTextAlignmentRight;
return accent;
}
memo
collectionview使ってみたので、いい勉強になった。あまり触ったことなかったし。
(とはいってもカスタムレイアウトはつくってないのだけれど…
当初考えていたよりなんか大掛かりになっちゃった。5つクラスつくっちゃった…。
あとは上下スワイプで、年単位の切り替えとかつけるかも。
よくよく見てみたら…曜日表記(Sun/Mon...)がない。。すっかり忘れてた(汗)