FSCalendar
A fully customizable iOS calendar library, compatible with Objective-C and Swift
Install / Use
/learn @WenchaoD/FSCalendarREADME
Table of contents
<a id="screenshots"></a>Screenshots
iPhone

iPad

Safe Orientation

Today Extension
| iOS8/9 | iOS10 |
|--------------|-------------|
|
|
|
Interactive Scope Gesture
|
|
| ---- |
DIY support
|
|
| ------------- |
To customize your own cell, view DIY Example in
Example-SwiftorExample-Objc
Swipe-To-Choose
|Single-Selection<br/>Swipe-To-Choose|Multiple-Selection<br/>Swipe-To-Choose|DIY<br/>Swipe-To-Choose|
|----------|--------|--------|
|
|
|
|
Achievement of Users <a id="achievement"></a>
|
|
|
|
|
| ------------- | ------------- | ------------- | ------------- |
More Achievements are available in FSCalendar Gallery
<a id="installation"></a>Installation
CocoaPods:
- For iOS8+: 👍
use_frameworks!
target '<Your Target Name>' do
pod 'FSCalendar'
end
- For iOS7+:
target '<Your Target Name>' do
pod 'FSCalendar'
end
NSCalendarExtension is required to get iOS7 compatibility.
Carthage:
- For iOS8+
github "WenchaoD/FSCalendar"
SPM:
Add dependency:
.package(url: "https://github.com/WenchaoD/FSCalendar.git", from: "2.8.4")
Manually:
- Drag all files under
FSCalendarfolder into your project. 👍
Alternatively to give it a test run, simply press
command+uinExample-ObjcorExample-Swiftand launch the UITest Target. <br> Only the methods marked "👍" support IBInspectable / IBDesignable feature. Have fun with Interface builder
Setup
Use Interface Builder
1、 Drag an UIView object to ViewController Scene
2、 Change the Custom Class to FSCalendar<br/>
3、 Link dataSource and delegate to the ViewController <br/>

4、 Finally, implement FSCalendarDataSource and FSCalendarDelegate in your ViewController
Or use code
@property (weak , nonatomic) FSCalendar *calendar;
// In loadView(Recommended) or viewDidLoad
FSCalendar *calendar = [[FSCalendar alloc] initWithFrame:CGRectMake(0, 0, 320, 300)];
calendar.dataSource = self;
calendar.delegate = self;
[self.view addSubview:calendar];
self.calendar = calendar;
<br/>
Or swift
- To use
FSCalendarin swift, you need to Create Bridge Header first.
fileprivate weak var calendar: FSCalendar!
// In loadView or viewDidLoad
let calendar = FSCalendar(frame: CGRect(x: 0, y: 0, width: 320, height: 300))
calendar.dataSource = self
calendar.delegate = self
view.addSubview(calendar)
self.calendar = calendar
To use FSCalendar in Swift3, see
Example-Swiftfor details.
<a id='adjusts_frame_dynamicly' /></a>Warning
FSCalendar doesn't update frame by itself, Please implement
- For AutoLayout
- (void)calendar:(FSCalendar *)calendar boundingRectWillChange:(CGRect)bounds animated:(BOOL)animated
{
self.calendarHeightConstraint.constant = CGRectGetHeight(bounds);
// Do other updates here
[self.view layoutIfNeeded];
}
- For Manual Layout
- (void)calendar:(FSCalendar *)calendar boundingRectWillChange:(CGRect)bounds animated:(BOOL)animated
{
calendar.frame = (CGRect){calendar.frame.origin,bounds.size};
// Do other updates here
}
- If you are using Masonry
- (void)calendar:(FSCalendar *)calendar boundingRectWillChange:(CGRect)bounds animated:(BOOL)animated
{
[calendar mas_updateConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(@(bounds.size.height));
// Do other updates
}];
[self.view layoutIfNeeded];
}
- If you are using SnapKit
func calendar(_ calendar: FSCalendar, boundingRectWillChange bounds: CGRect, animated: Bool) {
calendar.snp.updateConstraints { (make) in
make.height.equalTo(bounds.height)
// Do other updates
}
self.view.layoutIfNeeded()
}
<a id="roll_with_interface_builder"></a> Roll with Interface Builder

<a id="pre-knowledge"></a>Pre-knowledge
In
Swift3,NSDateandNSDateFormatterhave been renamed to Date and DateFormatter , seeExample-Swiftfor details.
How to create NSDate object
- By NSCalendar.
self.gregorian = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
Then:
NSDate *date = [gregorian dateWithEra:1 year:2016 month:9 day:10 hour:0 minute:0 second:0 nanosecond:0];
// 2016-09-10 00:00:00
- Or by NSDateFormatter
self.formatter = [[NSDateFormatter alloc] init];
self.formatter.dateFormat = @"yyyy-MM-dd";
Then:
NSDate *date = [self.formatter dateFromString:@"2016-09-10"];
How to print out NSDate object
- Use NSDateFormatter
self.formatter = [[NSDateFormatter alloc] init];
self.formatter.dateFormat = @"yyyy/MM/dd";
NSString *string = [self.formatter stringFromDate:date];
NSLog(@"Date is %@", string);
How to manipulate NSDate with NSCalendar
self.gregorian = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
- Get component of NSDate
NSInteger era = [self.gregorian component:NSCalendarUnitEra fromDate:date];
NSInteger year = [self.gregorian component:NSCalendarUnitYear fromDate:date];
NSInteger month = [self.gregorian component:NSCalendarUnitMonth fromDate:date];
NSInteger day = [self.gregorian component:NSCalendarUnitDay fromDate:date];
NSInteger hour = [self.gregorian component:NSCalendarUnitHour fromDate:date];
NSInteger minute = [self.gregorian component:NSCalendarUnitMinute fromDate:date];
...
- Get next month
NSDate *nextMonth = [self.gregorain dateByAddingUnit:NSCalendarUnitMonth value:1 toDate:date options:0];
- Get next day
NSDate *nextDay = [self.gregorain dateByAddingUnit:NSCalendarUnitDay value:1 toDate:date options:0];
- Is date in today/tomorrow/yesterday/weekend
BOOL isToday = [self.gregorian isDateInToday:date];
BOOL isYesterday = [self.gregorian isDateInYesterday:date];
BOOL isTomorrow = [self.gregorian isDateInTomorrow:date];
BOOL isWeekend = [self.gregorian isDateInWeekend:date];
- Compare two dates
BOOL sameDay = [self.gregorian isDate:date1 inSameDayAsDate:date2];
// Yes if the date1 and date2 are in same day
[self.gregorian compareDate:date1 toDate:date2 toUnitGranularity:unit];
// compare the era/year/month/day/hour/minute .etc ...
// return NSOrderAscending/NSOrderSame/NSOrderDecending
BOOL inSameUnit = [self.gregorian isDate:date1 equalToDate:date2 toUnitGranularity:unit];
// if the given unit (era/year/month/day/hour/minute .etc) are th
<br/><br/>
