WenchaoD/FSCalendar
WenchaoD/FSCalendar has 10,628 GitHub stars and 1,940 forks. GitHot measured -1 stars in 24 hours. Last checked 2026-11-06 20:42 UTC. Last push 2024-08-10.
A fully customizable iOS calendar library, compatible with Objective-C and Swift
Measured star growth
- in 24h
- -1
- in 7 days
- Collecting history
- in 15 days
- Collecting history
- in 1 month
- Collecting history
Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.
README.md
OriginalTable of contents
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 Swipe-To-Choose |
Multiple-Selection Swipe-To-Choose |
DIY Swipe-To-Choose |
|---|---|---|
![]() |
![]() |
![]() |
Achievement of Users
![]() |
![]() |
![]() |
![]() |
|---|
More Achievements are available in FSCalendar Gallery
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.
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
3、 Link dataSource and delegate to the ViewController

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;
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.
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()
}
Roll with Interface Builder

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 the same
Support this repo
- ★Star this repo
- Support with
- Support with
or

Contact
If your made a beautiful calendar with this library in your app, please take a screen shot and @me in twitter. Your help really means a lot to me!
License
FSCalendar is available under the MIT license. See the LICENSE file for more info.
Documentation | More Usage | 简书
Explore related projects
codecrafters-io/build-your-own-x
Master programming by recreating your favorite technologies from scratch.
560,467 starspublic-apis/public-apis
A collective list of free APIs
496,780 starsmorluto/rea
Reverse engineer anything with agents, from app behavior down to native binaries.
438,313 starsopenclaw/openclaw
The AI that really does things. Any OS. Any Platform. The lobster way. 🦞
394,084 stars










