![logo](https://cloud.githubusercontent.com/assets/5186464/16540124/efc51f72-408b-11e6-934a-4e750b8b55bb.png)

[![Travis](https://travis-ci.org/WenchaoD/FSCalendar.svg?branch=master)](https://travis-ci.org/WenchaoD/FSCalendar) [![Version](https://img.shields.io/cocoapods/v/FSCalendar.svg?style=flat)](http://cocoadocs.org/docsets/FSCalendar) [![Platform](https://img.shields.io/badge/platform-iOS%207%2B-blue.svg?style=flat)](http://cocoadocs.org/docsets/FSCalendar) [![Swift2 compatible](https://img.shields.io/badge/swift-compatible-4BC51D.svg?style=flat)](https://developer.apple.com/swift/) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) # Updates * [NSCalendarExtension](https://github.com/WenchaoD/NSCalendarExtension) is required to get iOS7 compatibility. # Table of contents * [Screenshots](#screenshots) * [Installation](#installation) * [Pre-knowledge](#pre-knowledge) * [Support](#support) * [Contact](#contact) [**QQ支持群: 323861692**](#qq_group) ## Screenshots ![fscalendar-users](https://cloud.githubusercontent.com/assets/5186464/19956154/dd0f6bb4-a1c3-11e6-8fed-6aabbf999161.jpg) ## Fully DIV support | ![1](https://cloud.githubusercontent.com/assets/5186464/20026983/22354a0e-a342-11e6-8ae6-0614ea7f35ae.gif) | | ------------- | ## Working with AutoLayout and Orientation ![fscalendar-scope-orientation-autolayout](https://cloud.githubusercontent.com/assets/5186464/13728798/59855e3e-e95e-11e5-84db-60f843427ef3.gif) ## Hide placeholder dates ![fscalendar-showsplaceholder](https://cloud.githubusercontent.com/assets/5186464/13727902/21a90042-e940-11e5-9b9f-392f38cf007d.gif) > FSCalendar doesn't change frame or the constraint by itself, see [Adjusts frame dynamicly](#adjusts_frame_dynamicly)
## Today Extension (iOS8/9) ![1](https://cloud.githubusercontent.com/assets/5186464/18406887/47c4822c-7736-11e6-96f0-ccb4c9cba199.gif) ## Today Extension With NCWidgetDisplayMode (iOS10) ![2](https://cloud.githubusercontent.com/assets/5186464/18870531/9afa7cd4-84e3-11e6-93c6-4e8811fd71a7.gif) # Installation ## CocoaPods: * For iOS8+: 👍 ```ruby use_frameworks! pod 'FSCalendar' ``` * For iOS7+: ```ruby pod 'FSCalendar' ``` > [NSCalendarExtension](https://github.com/WenchaoD/NSCalendarExtension) is required to get iOS7 compatibility. * Alternatively to give it a test run, run the command: ```ruby pod try FSCalendar ``` ## Carthage: * For iOS8+ ```ruby github "WenchaoD/FSCalendar" ``` ## Manually: * Drag all files under `FSCalendar` folder into your project. 👍 ## Support IBInspectable / IBDesignable Only the methods marked "👍" support IBInspectable / IBDesignable feature. [Have fun with Interface builder](#roll_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
![fscalendar-ib](https://cloud.githubusercontent.com/assets/5186464/9488580/a360297e-4c0d-11e5-8548-ee9274e7c4af.jpg) 4. Finally, you should implement `FSCalendarDataSource` and `FSCalendarDelegate` in ViewController.m ## Or use code ```objc @property (weak , nonatomic) FSCalendar *calendar; ``` ```objc // 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 `FSCalendar` in swift, you need to [Create Bridge Header](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html) first. ```swift private weak var calendar: FSCalendar! ``` ```swift // 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 ``` > **FSCalendar** is fully compatible for Swift3, see `SwiftExample` for more details.
## Warning `FSCalendar` doesn't change frame by itself, Please implement * For autoLayout ```objc - (void)calendar:(FSCalendar *)calendar boundingRectWillChange:(CGRect)bounds animated:(BOOL)animated { _calendarHeightConstraint.constant = CGRectGetHeight(bounds); [self.view layoutIfNeeded]; } ``` * For manual layout ```objc - (void)calendar:(FSCalendar *)calendar boundingRectWillChange:(CGRect)bounds animated:(BOOL)animated { calendar.frame = (CGRect){calendar.frame.origin,bounds.size}; } ``` ### Roll with Interface Builder ![fscalendar - ibdesignable](https://cloud.githubusercontent.com/assets/5186464/9301716/2e76a2ca-4503-11e5-8450-1fa7aa93e9fd.gif) # Pre-knowledge > In `Swift3`, `NSDate` and `NSDateFormatter` have been renamed to ***Date*** and ***DateFormatter*** , see `SwiftExample` for details. ## How to create NSDate object * By **NSCalendar**. ```objc self.gregorian = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]; ``` Then: ```objc 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** ```objc self.formatter = [[NSDateFormatter alloc] init]; self.formatter.dateFormat = @"yyyy-MM-dd"; ``` Then: ```objc NSDate *date = [self.formatter dateFromString:@"2016-09-10"]; ``` ## How to print out NSDate object * Use **NSDateFormatter** ```objc self.formatter = [[NSDateFormatter alloc] init]; self.formatter.dateFormat = @"yyyy/MM/dd"; ``` ```objc NSString *string = [self.formatter stringFromDate:date]; NSLog(@"Date is %@", string); ``` ## How to manipulate NSDate with NSCalendar ```objc self.gregorian = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]; ``` * Get component of NSDate ```objc 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** ```objc NSDate *nextMonth = [self.gregorain dateByAddingUnit:NSCalendarUnitMonth value:1 toDate:date options:0]; ``` * Get next **day** ```objc NSDate *nextDay = [self.gregorain dateByAddingUnit:NSCalendarUnitDay value:1 toDate:date options:0]; ``` * Is date in today/tomorrow/yesterday/weekend ```objc 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 ```objc 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 star
* Support with  
* Support with or
## Contact * 微博: [**@WenchaoD**](http://weibo.com/WenchaoD) * Twitter:[**@WenchaoD**](https://twitter.com/WenchaoD) * QQ群:

       ![fscalendar](https://cloud.githubusercontent.com/assets/5186464/18407011/8e4b6e48-7738-11e6-9fad-0e23cc881516.JPG) > If your made a beautiful calendar with this library in your app, please take a screen shot and [@me](https://twitter.com/WenchaoD) in twitter. Your help really means a lot to me!
> 如果你用这个库完成了一个外观漂亮的日历,希望你能将这个漂亮的日历截图在微博中[@我](http://weibo.com/WenchaoD),十分感谢! # License FSCalendar is available under the MIT license. See the LICENSE file for more info.