在项目中经常有使用到日历,大部分使用场景都需要自定义日历,FSCalendar能适应大部分场景
参考如下的使用文档:
FSCalendarHeaderTouchDeliver
- 为FSCalendarHeaderView
和FSCalendarWeekdayView
组合成的部分scope分为month和week,通过scope
来设置
typedef NS_ENUM(NSUInteger, FSCalendarScope) { //范围
FSCalendarScopeMonth,
FSCalendarScopeWeek
};
@property (assign, nonatomic) FSCalendarScope scope;
改变scope
后,会触发内在的frame发生变化,可在如下方法中做出调整:
- (void)calendar:(FSCalendar *)calendar boundingRectWillChange:(CGRect)bounds animated:(BOOL)animated;
例如,通过如下的代码做出动态的调节:
- (IBAction)toggleClicked:(id)sender
{
if (self.calendar.scope == FSCalendarScopeMonth) {
[self.calendar setScope:FSCalendarScopeWeek animated:_animationSwitch.on];
} else {
[self.calendar setScope:FSCalendarScopeMonth animated:_animationSwitch.on];
}
}
typedef NS_ENUM(NSUInteger, FSCalendarPlaceholderType) {
FSCalendarPlaceholderTypeNone = 0,
FSCalendarPlaceholderTypeFillHeadTail = 1, //填满头部和尾部
FSCalendarPlaceholderTypeFillSixRows = 2 //6行
};
FSCalendarPlaceholderTypeFillSixRows
FSCalendarPlaceholderTypeFillHeadTail
calendar.locale = [NSLocale localeWithLocaleIdentifier:@"zh_cn"];//中文
calendar
的appearance
属性为FSCalendarAppearance
类型,其有个caseOptions
属性
如果设置为如下的属性:
calendar.appearance.caseOptions = FSCalendarCaseOptionsHeaderUsesUpperCase|FSCalendarCaseOptionsWeekdayUsesUpperCase;
calendar.appearance.caseOptions = FSCalendarCaseOptionsHeaderUsesUpperCase|FSCalendarCaseOptionsWeekdayUsesSingleUpperCase;
颜色可通过appearance
相关的属性来设置,也可通过代理来实现
FSCalendarAppearance
@protocol FSCalendarDelegateAppearance <FSCalendarDelegate>
单元格中的字体大小默认是自适应的,需要先关闭自适应。否则字体尺寸不会发生改变。
calendar.appearance.adjustsFontSizeToFitContentSize = NO; // 关闭文字尺寸自适应
同样可以通过属性和代理来设置
FSCalendarAppearance
默认情况下today和选中的标识都是圆圈
通过calendar.appearance.borderRadius = 0
,可设置为方形
通过firstWeekday
属性可以设置calendar的第一天是星期几,如果设置2
,则表示第一个是Mon
星期一
scrollDirection
设置滚动的方向,可选值如下:
typedef NS_ENUM(NSUInteger, FSCalendarScrollDirection) {//滚动方向
FSCalendarScrollDirectionVertical,
FSCalendarScrollDirectionHorizontal
};
默认情况下,today
的显示效果类似如下:
如果设置self.calendar.today = nil;
,则显示效果如下:
// FSCalendarDataSource
- (NSDate *)minimumDateForCalendar:(FSCalendar *)calendar
{
return yourMinimumDate;
}
- (NSDate *)maximumDateForCalendar:(FSCalendar *)calendar
{
return yourMaximumDate;
}
设置日期可以使用如下的方法:
self.gregorian = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
......
- (NSDate *)maximumDateForCalendar:(FSCalendar *)calendar
{
return [self.gregorian dateByAddingUnit:NSCalendarUnitMonth value:5 toDate:[NSDate date] options:0];
}
FSCalendarCell大概由如下的几个部分组成:
可继承FSCalendarCell
,自定义cell,达到自定义UI的目的
先注册,再使用
[calendar registerClass:[DIYCalendarCell class] forCellReuseIdentifier:@"cell"];
- (FSCalendarCell *)calendar:(FSCalendar *)calendar cellForDate:(NSDate *)date atMonthPosition:(FSCalendarMonthPosition)monthPosition
{
DIYCalendarCell *cell = [calendar dequeueReusableCellWithIdentifier:@"cell" forDate:date atMonthPosition:monthPosition];
return cell;
}