Remove scope injection

This commit is contained in:
WenchaoD 2017-01-05 15:28:19 +08:00
parent 806d31f6f4
commit f1b828c191
11 changed files with 114 additions and 112 deletions

View File

@ -49,9 +49,9 @@
30B0BB021B8D9B6C004B9476 /* FSCalendarCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 30B0BAC31B8D8E22004B9476 /* FSCalendarCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
30B0BB031B8D9B6D004B9476 /* FSCalendarDynamicHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 30B0BAC51B8D8E22004B9476 /* FSCalendarDynamicHeader.h */; settings = {ATTRIBUTES = (Private, ); }; };
30B0BB041B8D9B6D004B9476 /* FSCalendarHeaderView.h in Headers */ = {isa = PBXBuildFile; fileRef = 30B0BAC61B8D8E22004B9476 /* FSCalendarHeaderView.h */; settings = {ATTRIBUTES = (Public, ); }; };
30CEF9001C950C1F008EAFB1 /* FSCalendarAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = 30CEF8FE1C950C1F008EAFB1 /* FSCalendarAnimator.h */; settings = {ATTRIBUTES = (Private, ); }; };
30CEF9011C950C1F008EAFB1 /* FSCalendarAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 30CEF8FF1C950C1F008EAFB1 /* FSCalendarAnimator.m */; };
30CEF9021C950C1F008EAFB1 /* FSCalendarAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 30CEF8FF1C950C1F008EAFB1 /* FSCalendarAnimator.m */; };
30CEF9001C950C1F008EAFB1 /* FSCalendarTransitionCoordinator.h in Headers */ = {isa = PBXBuildFile; fileRef = 30CEF8FE1C950C1F008EAFB1 /* FSCalendarTransitionCoordinator.h */; settings = {ATTRIBUTES = (Private, ); }; };
30CEF9011C950C1F008EAFB1 /* FSCalendarTransitionCoordinator.m in Sources */ = {isa = PBXBuildFile; fileRef = 30CEF8FF1C950C1F008EAFB1 /* FSCalendarTransitionCoordinator.m */; };
30CEF9021C950C1F008EAFB1 /* FSCalendarTransitionCoordinator.m in Sources */ = {isa = PBXBuildFile; fileRef = 30CEF8FF1C950C1F008EAFB1 /* FSCalendarTransitionCoordinator.m */; };
30D55B101C90240000BB43D5 /* HidePlaceholderViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 30D55B0F1C90240000BB43D5 /* HidePlaceholderViewController.m */; };
30DBE3C41DC641AD005A22B7 /* FSCalendarCalculator.h in Headers */ = {isa = PBXBuildFile; fileRef = 30DBE3C21DC641AD005A22B7 /* FSCalendarCalculator.h */; settings = {ATTRIBUTES = (Private, ); }; };
30DBE3C51DC641AD005A22B7 /* FSCalendarCalculator.m in Sources */ = {isa = PBXBuildFile; fileRef = 30DBE3C31DC641AD005A22B7 /* FSCalendarCalculator.m */; };
@ -145,8 +145,8 @@
30B0BAC61B8D8E22004B9476 /* FSCalendarHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FSCalendarHeaderView.h; sourceTree = "<group>"; };
30B0BAC71B8D8E22004B9476 /* FSCalendarHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FSCalendarHeaderView.m; sourceTree = "<group>"; };
30B0BACA1B8D8E22004B9476 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
30CEF8FE1C950C1F008EAFB1 /* FSCalendarAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FSCalendarAnimator.h; sourceTree = "<group>"; };
30CEF8FF1C950C1F008EAFB1 /* FSCalendarAnimator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FSCalendarAnimator.m; sourceTree = "<group>"; };
30CEF8FE1C950C1F008EAFB1 /* FSCalendarTransitionCoordinator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FSCalendarTransitionCoordinator.h; sourceTree = "<group>"; };
30CEF8FF1C950C1F008EAFB1 /* FSCalendarTransitionCoordinator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FSCalendarTransitionCoordinator.m; sourceTree = "<group>"; };
30D55B0E1C90240000BB43D5 /* HidePlaceholderViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HidePlaceholderViewController.h; sourceTree = SOURCE_ROOT; };
30D55B0F1C90240000BB43D5 /* HidePlaceholderViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HidePlaceholderViewController.m; sourceTree = SOURCE_ROOT; };
30DBE3C21DC641AD005A22B7 /* FSCalendarCalculator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FSCalendarCalculator.h; sourceTree = "<group>"; };
@ -258,8 +258,8 @@
30A495531DCAD9E6000B2F31 /* FSCalendarWeekdayView.m */,
30FCB3941BAAD112002B87AD /* FSCalendarStickyHeader.h */,
30FCB3951BAAD112002B87AD /* FSCalendarStickyHeader.m */,
30CEF8FE1C950C1F008EAFB1 /* FSCalendarAnimator.h */,
30CEF8FF1C950C1F008EAFB1 /* FSCalendarAnimator.m */,
30CEF8FE1C950C1F008EAFB1 /* FSCalendarTransitionCoordinator.h */,
30CEF8FF1C950C1F008EAFB1 /* FSCalendarTransitionCoordinator.m */,
301F79C91DFD39E700D8631E /* FSCalendarDelegationProxy.h */,
301F79CA1DFD39E700D8631E /* FSCalendarDelegationProxy.m */,
30F4C90D1E07C12B00D2EC4D /* FSCalendarDelegationFactory.h */,
@ -422,7 +422,7 @@
301F79CB1DFD39E700D8631E /* FSCalendarDelegationProxy.h in Headers */,
30F4C90F1E07C12B00D2EC4D /* FSCalendarDelegationFactory.h in Headers */,
30DBE3C41DC641AD005A22B7 /* FSCalendarCalculator.h in Headers */,
30CEF9001C950C1F008EAFB1 /* FSCalendarAnimator.h in Headers */,
30CEF9001C950C1F008EAFB1 /* FSCalendarTransitionCoordinator.h in Headers */,
30B0BB031B8D9B6D004B9476 /* FSCalendarDynamicHeader.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -593,7 +593,7 @@
3065CA971CD31B81006C218D /* FSCalendarScopeHandle.m in Sources */,
308B58D81CC08FFA004E812D /* ButtonsViewController.m in Sources */,
30B0BAD11B8D8E23004B9476 /* FSCalendarAppearance.m in Sources */,
30CEF9011C950C1F008EAFB1 /* FSCalendarAnimator.m in Sources */,
30CEF9011C950C1F008EAFB1 /* FSCalendarTransitionCoordinator.m in Sources */,
EEC9C03A1BDC9E7000383A07 /* FSCalendarCollectionView.m in Sources */,
301F79CC1DFD39E700D8631E /* FSCalendarDelegationProxy.m in Sources */,
30D55B101C90240000BB43D5 /* HidePlaceholderViewController.m in Sources */,
@ -623,7 +623,7 @@
3055B1C41DA9323A002AFA13 /* FSCalendarExtensions.m in Sources */,
309539911C38D66C00BD37AA /* FSCalendarCollectionViewLayout.m in Sources */,
3065CA981CD31B81006C218D /* FSCalendarScopeHandle.m in Sources */,
30CEF9021C950C1F008EAFB1 /* FSCalendarAnimator.m in Sources */,
30CEF9021C950C1F008EAFB1 /* FSCalendarTransitionCoordinator.m in Sources */,
30FCB3981BAAD112002B87AD /* FSCalendarStickyHeader.m in Sources */,
30F4C9111E07C12B00D2EC4D /* FSCalendarDelegationFactory.m in Sources */,
);

View File

@ -8,6 +8,8 @@
#import "FSCalendarScopeExampleViewController.h"
static void * __KVOContext;
@implementation FSCalendarScopeExampleViewController
#pragma mark - Life cycle
@ -28,18 +30,32 @@
[self.view addGestureRecognizer:panGesture];
self.scopeGesture = panGesture;
// While the scope gesture begin, the tableView gesture cancel.
// While the scope gesture begin, the pan gesture of tableView should cancel.
[self.tableView.panGestureRecognizer requireGestureRecognizerToFail:panGesture];
self.calendar.scope = FSCalendarScopeWeek;
// Uncomment this to perform an 'initial-week-scope'
_calendar.scope = FSCalendarScopeWeek;
[self.calendar addObserver:self forKeyPath:@"scope" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:__KVOContext];
}
- (void)dealloc
{
[self.calendar removeObserver:self forKeyPath:@"scope" context:__KVOContext];
NSLog(@"%s",__FUNCTION__);
}
#pragma mark - KVO
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
if (context == __KVOContext) {
FSCalendarScope oldScope = [change[NSKeyValueChangeOldKey] unsignedIntegerValue];
FSCalendarScope newScope = [change[NSKeyValueChangeNewKey] unsignedIntegerValue];
NSLog(@"From %@ to %@",(oldScope==FSCalendarScopeWeek?@"week":@"month"),(newScope==FSCalendarScopeWeek?@"week":@"month"));
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
#pragma mark - UIGestureRecognizerDelegate
// Whether scope gesture should begin

View File

@ -17,7 +17,7 @@
#import "FSCalendarDynamicHeader.h"
#import "FSCalendarCollectionView.h"
#import "FSCalendarAnimator.h"
#import "FSCalendarTransitionCoordinator.h"
#import "FSCalendarCalculator.h"
#import "FSCalendarDelegationFactory.h"
@ -77,7 +77,7 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
@property (weak , nonatomic) FSCalendarCollectionView *collectionView;
@property (weak , nonatomic) FSCalendarCollectionViewLayout *collectionViewLayout;
@property (strong, nonatomic) FSCalendarAnimator *animator;
@property (strong, nonatomic) FSCalendarTransitionCoordinator *transitionCoordinator;
@property (strong, nonatomic) FSCalendarCalculator *calculator;
@property (weak , nonatomic) FSCalendarHeaderTouchDeliver *deliver;
@ -265,7 +265,7 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
[self registerMainRunloopObserver];
// Assistants
self.animator = [[FSCalendarAnimator alloc] initWithCalendar:self];
self.transitionCoordinator = [[FSCalendarTransitionCoordinator alloc] initWithCalendar:self];
self.calculator = [[FSCalendarCalculator alloc] initWithCalendar:self];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil];
@ -289,7 +289,7 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
- (void)setBounds:(CGRect)bounds
{
[super setBounds:bounds];
if (!CGRectIsEmpty(bounds) && self.animator.state == FSCalendarTransitionStateIdle) {
if (!CGRectIsEmpty(bounds) && self.transitionCoordinator.state == FSCalendarTransitionStateIdle) {
[self invalidateViewFrames];
}
}
@ -297,7 +297,7 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
- (void)setFrame:(CGRect)frame
{
[super setFrame:frame];
if (!CGRectIsEmpty(frame) && self.animator.state == FSCalendarTransitionStateIdle) {
if (!CGRectIsEmpty(frame) && self.transitionCoordinator.state == FSCalendarTransitionStateIdle) {
[self invalidateViewFrames];
}
}
@ -332,8 +332,8 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
if (_needsAdjustingViewFrame) {
_needsAdjustingViewFrame = NO;
if (CGSizeEqualToSize(_animator.cachedMonthSize, CGSizeZero)) {
_animator.cachedMonthSize = self.frame.size;
if (CGSizeEqualToSize(_transitionCoordinator.cachedMonthSize, CGSizeZero)) {
_transitionCoordinator.cachedMonthSize = self.frame.size;
}
BOOL needsAdjustingBoundingRect = (self.scope == FSCalendarScopeMonth) &&
@ -341,15 +341,13 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
!self.hasValidateVisibleLayout;
if (_scopeHandle) {
CGFloat scopeHandleHeight = self.animator.cachedMonthSize.height*0.08;
CGFloat scopeHandleHeight = self.transitionCoordinator.cachedMonthSize.height*0.08;
_contentView.frame = CGRectMake(0, 0, self.fs_width, self.fs_height-scopeHandleHeight);
_scopeHandle.frame = CGRectMake(0, _contentView.fs_bottom, self.fs_width, scopeHandleHeight);
} else {
_contentView.frame = self.bounds;
}
if (_needsLayoutForWeekMode) _scope = FSCalendarScopeMonth;
CGFloat headerHeight = self.preferredHeaderHeight;
CGFloat weekdayHeight = self.preferredWeekdayHeight;
CGFloat rowHeight = self.preferredRowHeight;
@ -358,25 +356,23 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
rowHeight = FSCalendarFloor(rowHeight*2)*0.5; // Round to nearest multiple of 0.5. e.g. (16.8->16.5),(16.2->16.0)
}
if (_needsLayoutForWeekMode) _scope = FSCalendarScopeWeek;
self.calendarHeaderView.frame = CGRectMake(0, 0, self.fs_width, headerHeight);
self.calendarWeekdayView.frame = CGRectMake(0, self.calendarHeaderView.fs_bottom, self.contentView.fs_width, weekdayHeight);
_deliver.frame = CGRectMake(self.calendarHeaderView.fs_left, self.calendarHeaderView.fs_top, self.calendarHeaderView.fs_width, headerHeight+weekdayHeight);
_deliver.hidden = self.calendarHeaderView.hidden;
if (!self.floatingMode) {
switch (_scope) {
switch (self.transitionCoordinator.representingScope) {
case FSCalendarScopeMonth: {
CGFloat contentHeight = rowHeight*6 + padding*2;
CGFloat currentHeight = rowHeight*[self.calculator numberOfRowsInMonth:self.currentPage] + padding*2;
_daysContainer.frame = CGRectMake(0, headerHeight+weekdayHeight, self.fs_width, currentHeight);
_collectionView.frame = CGRectMake(0, 0, _daysContainer.fs_width, contentHeight);
if (needsAdjustingBoundingRect) {
self.animator.state = FSCalendarTransitionStateChanging;
self.transitionCoordinator.state = FSCalendarTransitionStateChanging;
CGRect boundingRect = (CGRect){CGPointZero,[self sizeThatFits:self.frame.size]};
[self.delegateProxy calendar:self boundingRectWillChange:boundingRect animated:NO];
self.animator.state = FSCalendarTransitionStateIdle;
self.transitionCoordinator.state = FSCalendarTransitionStateIdle;
}
break;
}
@ -402,8 +398,7 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
if (_needsLayoutForWeekMode) {
_needsLayoutForWeekMode = NO;
_scope = FSCalendarScopeWeek;
[self.animator performScopeTransitionFromScope:FSCalendarScopeMonth toScope:FSCalendarScopeWeek animated:NO];
[self.transitionCoordinator performScopeTransitionFromScope:FSCalendarScopeMonth toScope:FSCalendarScopeWeek animated:NO];
} else {
if (_needsAdjustingMonthPosition) {
_needsAdjustingMonthPosition = NO;
@ -431,11 +426,11 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
- (CGSize)sizeThatFits:(CGSize)size
{
switch (self.animator.transition) {
switch (self.transitionCoordinator.transition) {
case FSCalendarTransitionNone:
return [self sizeThatFits:size scope:_scope];
case FSCalendarTransitionWeekToMonth:
if (self.animator.state == FSCalendarTransitionStateChanging) {
if (self.transitionCoordinator.state == FSCalendarTransitionStateChanging) {
return [self sizeThatFits:size scope:FSCalendarScopeMonth];
}
case FSCalendarTransitionMonthToWeek:
@ -480,22 +475,18 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
if (self.animator.transition == FSCalendarTransitionWeekToMonth && self.animator.state == FSCalendarTransitionStateChanging) {
return 42;
}
if (!self.floatingMode) {
switch (_scope) {
case FSCalendarScopeMonth: {
return 42;
}
case FSCalendarScopeWeek: {
return 7;
}
}
} else {
if (self.floatingMode) {
NSInteger numberOfRows = [self.calculator numberOfRowsInSection:section];
return numberOfRows * 7;
}
switch (self.transitionCoordinator.representingScope) {
case FSCalendarScopeMonth: {
return 42;
}
case FSCalendarScopeWeek: {
return 7;
}
}
return 7;
}
@ -699,7 +690,7 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
_currentPage = targetPage;
[self.delegateProxy calendarCurrentPageDidChange:self];
if (_placeholderType != FSCalendarPlaceholderTypeFillSixRows) {
[self.animator performBoundingRectTransitionFromMonth:lastPage toMonth:_currentPage duration:0.25];
[self.transitionCoordinator performBoundingRectTransitionFromMonth:lastPage toMonth:_currentPage duration:0.25];
}
[self didChangeValueForKey:@"currentPage"];
}
@ -979,7 +970,7 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
if (_preferredWeekdayHeight == FSCalendarAutomaticDimension) {
if (!self.floatingMode) {
CGFloat DIYider = FSCalendarStandardMonthlyPageHeight;
CGFloat contentHeight = self.animator.cachedMonthSize.height*(1-_showsScopeHandle*0.08);
CGFloat contentHeight = self.transitionCoordinator.cachedMonthSize.height*(1-_showsScopeHandle*0.08);
_preferredHeaderHeight = (FSCalendarStandardHeaderHeight/DIYider)*contentHeight;
_preferredHeaderHeight -= (_preferredHeaderHeight-FSCalendarStandardHeaderHeight)*0.5;
} else {
@ -997,7 +988,7 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
if (_preferredWeekdayHeight == FSCalendarAutomaticDimension) {
if (!self.floatingMode) {
CGFloat DIYider = FSCalendarStandardMonthlyPageHeight;
CGFloat contentHeight = self.animator.cachedMonthSize.height*(1-_showsScopeHandle*0.08);
CGFloat contentHeight = self.transitionCoordinator.cachedMonthSize.height*(1-_showsScopeHandle*0.08);
_preferredWeekdayHeight = (FSCalendarStandardWeekdayHeight/DIYider)*contentHeight;
} else {
_preferredWeekdayHeight = FSCalendarStandardWeekdayHeight*MAX(1, FSCalendarDeviceIsIPad*1.5)*_lineHeightMultiplier;
@ -1013,7 +1004,7 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
if (_preferredRowHeight == FSCalendarAutomaticDimension) {
CGFloat headerHeight = self.preferredHeaderHeight;
CGFloat weekdayHeight = self.preferredWeekdayHeight;
CGFloat contentHeight = self.animator.cachedMonthSize.height-headerHeight-weekdayHeight-_scopeHandle.fs_height;
CGFloat contentHeight = self.transitionCoordinator.cachedMonthSize.height-headerHeight-weekdayHeight-_scopeHandle.fs_height;
CGFloat padding = 5;
if (!self.floatingMode) {
_preferredRowHeight = (contentHeight-padding*2)/6.0;
@ -1023,6 +1014,7 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
}
return _preferredRowHeight;
}
- (BOOL)floatingMode
{
return _scope == FSCalendarScopeMonth && _scrollEnabled && !_pagingEnabled;
@ -1039,8 +1031,8 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
- (UIPanGestureRecognizer *)scopeGesture
{
if (!_scopeGesture) {
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self.animator action:@selector(handleScopeGesture:)];
panGesture.delegate = self.animator;
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self.transitionCoordinator action:@selector(handleScopeGesture:)];
panGesture.delegate = self.transitionCoordinator;
panGesture.minimumNumberOfTouches = 1;
panGesture.maximumNumberOfTouches = 2;
panGesture.enabled = NO;
@ -1122,9 +1114,9 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
return;
}
if (self.animator.state == FSCalendarTransitionStateIdle) {
if (self.transitionCoordinator.state == FSCalendarTransitionStateIdle) {
m_set_scope
[self.animator performScopeTransitionFromScope:prevScope toScope:scope animated:animated];
[self.transitionCoordinator performScopeTransitionFromScope:prevScope toScope:scope animated:animated];
}
}
@ -1243,7 +1235,7 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
- (void)handleScopeGesture:(UIPanGestureRecognizer *)sender
{
[self.animator handleScopeGesture:sender];
[self.transitionCoordinator handleScopeGesture:sender];
}
#pragma mark - Private methods
@ -1307,7 +1299,7 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
if ([self isDateInDifferentPage:date]) {
[self willChangeValueForKey:@"currentPage"];
NSDate *lastPage = _currentPage;
switch (_scope) {
switch (self.transitionCoordinator.representingScope) {
case FSCalendarScopeMonth: {
_currentPage = [self.gregorian fs_firstDayOfMonth:date];
break;
@ -1320,8 +1312,8 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
if (!_supressEvent && self.hasValidateVisibleLayout) {
_supressEvent = YES;
[self.delegateProxy calendarCurrentPageDidChange:self];
if (_placeholderType != FSCalendarPlaceholderTypeFillSixRows && self.animator.state == FSCalendarTransitionStateIdle) {
[self.animator performBoundingRectTransitionFromMonth:lastPage toMonth:_currentPage duration:0.33];
if (_placeholderType != FSCalendarPlaceholderTypeFillSixRows && self.transitionCoordinator.state == FSCalendarTransitionStateIdle) {
[self.transitionCoordinator performBoundingRectTransitionFromMonth:lastPage toMonth:_currentPage duration:0.33];
}
_supressEvent = NO;
}
@ -1345,7 +1337,7 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
- (BOOL)isPageInRange:(NSDate *)page
{
BOOL flag = YES;
switch (self.scope) {
switch (self.transitionCoordinator.representingScope) {
case FSCalendarScopeMonth: {
NSDateComponents *c1 = [self.gregorian components:NSCalendarUnitDay fromDate:[self.gregorian fs_firstDayOfMonth:self.minimumDate] toDate:page options:0];
flag &= (c1.day>=0);
@ -1568,7 +1560,7 @@ typedef NS_ENUM(NSUInteger, FSCalendarOrientation) {
cell.dateIsToday = self.today?[self.gregorian isDate:date inSameDayAsDate:self.today]:NO;
cell.weekend = [self.gregorian isDateInWeekend:date];
cell.monthPosition = [self.calculator monthPositionForIndexPath:indexPath];
switch (_scope) {
switch (self.transitionCoordinator.representingScope) {
case FSCalendarScopeMonth: {
cell.placeholder = (cell.monthPosition == FSCalendarMonthPositionPrevious || cell.monthPosition == FSCalendarMonthPositionNext) || ![self isDateInRange:date];
if (cell.placeholder) {

View File

@ -117,15 +117,12 @@
- (NSDate *)dateForIndexPath:(NSIndexPath *)indexPath
{
if (!indexPath) return nil;
if (self.calendar.animator.transition == FSCalendarTransitionWeekToMonth && self.calendar.animator.state == FSCalendarTransitionStateChanging) {
return [self dateForIndexPath:indexPath scope:FSCalendarScopeMonth];
}
return [self dateForIndexPath:indexPath scope:self.calendar.scope];
return [self dateForIndexPath:indexPath scope:self.calendar.transitionCoordinator.representingScope];
}
- (NSIndexPath *)indexPathForDate:(NSDate *)date
{
return [self indexPathForDate:date atMonthPosition:FSCalendarMonthPositionCurrent scope:self.calendar.scope];
return [self indexPathForDate:date atMonthPosition:FSCalendarMonthPositionCurrent scope:self.calendar.transitionCoordinator.representingScope];
}
- (NSIndexPath *)indexPathForDate:(NSDate *)date scope:(FSCalendarScope)scope
@ -165,12 +162,12 @@
- (NSIndexPath *)indexPathForDate:(NSDate *)date atMonthPosition:(FSCalendarMonthPosition)position
{
return [self indexPathForDate:date atMonthPosition:position scope:self.calendar.scope];
return [self indexPathForDate:date atMonthPosition:position scope:self.calendar.transitionCoordinator.representingScope];
}
- (NSDate *)pageForSection:(NSInteger)section
{
switch (self.calendar.scope) {
switch (self.calendar.transitionCoordinator.representingScope) {
case FSCalendarScopeWeek:
return [self.gregorian fs_middleDayOfWeek:[self weekForSection:section]];
case FSCalendarScopeMonth:
@ -221,10 +218,10 @@
- (NSInteger)numberOfSections
{
if (self.calendar.animator.transition == FSCalendarTransitionWeekToMonth) {
if (self.calendar.transitionCoordinator.transition == FSCalendarTransitionWeekToMonth) {
return self.numberOfMonths;
} else {
switch (self.calendar.scope) {
switch (self.calendar.transitionCoordinator.representingScope) {
case FSCalendarScopeMonth: {
return self.numberOfMonths;
}
@ -263,7 +260,7 @@
- (NSInteger)numberOfRowsInSection:(NSInteger)section
{
if (self.calendar.scope == FSCalendarScopeWeek) return 1;
if (self.calendar.transitionCoordinator.representingScope == FSCalendarScopeWeek) return 1;
NSDate *month = [self monthForSection:section];
return [self numberOfRowsInMonth:month];
}

View File

@ -95,7 +95,7 @@
if (self.placeholder) {
if (self.calendar.placeholderType==FSCalendarPlaceholderTypeNone) {
self.contentView.hidden = self.monthPosition != FSCalendarMonthPositionCurrent;
} else if (self.calendar.placeholderType == FSCalendarPlaceholderTypeFillHeadTail && self.calendar.scope == FSCalendarScopeMonth && !self.calendar.floatingMode) {
} else if (self.calendar.placeholderType == FSCalendarPlaceholderTypeFillHeadTail && self.calendar.transitionCoordinator.representingScope == FSCalendarScopeMonth && !self.calendar.floatingMode) {
NSIndexPath *indexPath = [self.calendar.collectionView indexPathForCell:self];

View File

@ -112,7 +112,7 @@
CGFloat height = ({
CGFloat height = FSCalendarStandardRowHeight;
if (!self.calendar.floatingMode) {
switch (self.calendar.scope) {
switch (self.calendar.transitionCoordinator.representingScope) {
case FSCalendarScopeMonth: {
height = (self.collectionView.fs_height-self.sectionInsets.top-self.sectionInsets.bottom)/6.0;
break;
@ -162,7 +162,7 @@
// Calculate item heights and tops
free(self.heights);
self.heights = ({
NSInteger rowCount = self.calendar.scope == FSCalendarScopeWeek ? 1 : 6;
NSInteger rowCount = self.calendar.transitionCoordinator.representingScope == FSCalendarScopeWeek ? 1 : 6;
size_t rowSize = sizeof(CGFloat)*rowCount;
CGFloat *heights = malloc(rowSize);
if (!self.calendar.floatingMode) {
@ -182,7 +182,7 @@
});
free(self.tops);
self.tops = ({
NSInteger rowCount = self.calendar.scope == FSCalendarScopeWeek ? 1 : 6;
NSInteger rowCount = self.calendar.transitionCoordinator.representingScope == FSCalendarScopeWeek ? 1 : 6;
size_t rowSize = sizeof(CGFloat)*rowCount;
CGFloat *tops = malloc(rowSize);
tops[0] = self.sectionInsets.top;
@ -267,7 +267,7 @@
NSInteger wholeSections = rect.size.width/self.collectionView.fs_width;
NSInteger numberOfColumns = wholeSections*7;
NSInteger numberOfRows = self.calendar.scope == FSCalendarScopeMonth ? 6 : 1;
NSInteger numberOfRows = self.calendar.transitionCoordinator.representingScope == FSCalendarScopeMonth ? 6 : 1;
NSInteger startSection = rect.origin.x/self.collectionView.fs_width;
CGFloat widthDelta1 = FSCalendarMod(CGRectGetMinX(rect), self.collectionView.fs_width) - self.sectionInsets.left;

View File

@ -19,7 +19,7 @@
#import "FSCalendarCollectionViewLayout.h"
#import "FSCalendarScopeHandle.h"
#import "FSCalendarCalculator.h"
#import "FSCalendarAnimator.h"
#import "FSCalendarTransitionCoordinator.h"
#import "FSCalendarDelegationProxy.h"
@interface FSCalendar (Dynamic)
@ -27,7 +27,7 @@
@property (readonly, nonatomic) FSCalendarCollectionView *collectionView;
@property (readonly, nonatomic) FSCalendarScopeHandle *scopeHandle;
@property (readonly, nonatomic) FSCalendarCollectionViewLayout *collectionViewLayout;
@property (readonly, nonatomic) FSCalendarAnimator *animator;
@property (readonly, nonatomic) FSCalendarTransitionCoordinator *transitionCoordinator;
@property (readonly, nonatomic) FSCalendarCalculator *calculator;
@property (readonly, nonatomic) BOOL floatingMode;
@property (readonly, nonatomic) NSArray *visibleStickyHeaders;

View File

@ -97,7 +97,7 @@
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
switch (self.calendar.scope) {
switch (self.calendar.transitionCoordinator.representingScope) {
case FSCalendarScopeMonth: {
switch (_scrollDirection) {
case UICollectionViewScrollDirectionVertical: {
@ -138,7 +138,7 @@
_calendar.formatter.dateFormat = _appearance.headerDateFormat;
BOOL usesUpperCase = (_appearance.caseOptions & 15) == FSCalendarCaseOptionsHeaderUsesUpperCase;
NSString *text = nil;
switch (self.calendar.scope) {
switch (self.calendar.transitionCoordinator.representingScope) {
case FSCalendarScopeMonth: {
if (_scrollDirection == UICollectionViewScrollDirectionHorizontal) {
//

View File

@ -8,7 +8,7 @@
#import "FSCalendarScopeHandle.h"
#import "FSCalendar.h"
#import "FSCalendarAnimator.h"
#import "FSCalendarTransitionCoordinator.h"
#import "FSCalendarDynamicHeader.h"
#import "FSCalendarExtensions.h"
@ -66,13 +66,13 @@
- (void)handlePan:(id)sender
{
[self.calendar.animator handleScopeGesture:sender];
[self.calendar.transitionCoordinator handleScopeGesture:sender];
}
- (void)setCalendar:(FSCalendar *)calendar
{
_calendar = calendar;
self.panGesture.delegate = self.calendar.animator;
self.panGesture.delegate = self.calendar.transitionCoordinator;
}
@end

View File

@ -1,5 +1,5 @@
//
// FSCalendarAnimator.h
// FSCalendarTransitionCoordinator.h
// FSCalendar
//
// Created by dingwenchao on 3/13/16.
@ -22,7 +22,7 @@ typedef NS_ENUM(NSUInteger, FSCalendarTransitionState) {
FSCalendarTransitionStateFinishing,
};
@interface FSCalendarAnimator : NSObject <UIGestureRecognizerDelegate>
@interface FSCalendarTransitionCoordinator : NSObject <UIGestureRecognizerDelegate>
@property (weak, nonatomic) FSCalendar *calendar;
@property (weak, nonatomic) FSCalendarCollectionView *collectionView;
@ -33,6 +33,8 @@ typedef NS_ENUM(NSUInteger, FSCalendarTransitionState) {
@property (assign, nonatomic) CGSize cachedMonthSize;
@property (readonly, nonatomic) FSCalendarScope representingScope;
- (instancetype)initWithCalendar:(FSCalendar *)calendar;
- (void)performScopeTransitionFromScope:(FSCalendarScope)fromScope toScope:(FSCalendarScope)toScope animated:(BOOL)animated;

View File

@ -1,23 +1,22 @@
//
// FSCalendarAnimator.m
// FSCalendarTransitionCoordinator.m
// FSCalendar
//
// Created by Wenchao Ding on 3/13/16.
// Copyright © 2016 Wenchao Ding. All rights reserved.
//
#import "FSCalendarAnimator.h"
#import "FSCalendarTransitionCoordinator.h"
#import "FSCalendarExtensions.h"
#import "FSCalendarDynamicHeader.h"
#import <objc/runtime.h>
@interface FSCalendarAnimator ()
@interface FSCalendarTransitionCoordinator ()
@property (readonly, nonatomic) FSCalendarTransitionAttributes *transitionAttributes;
@property (strong , nonatomic) FSCalendarTransitionAttributes *pendingAttributes;
@property (assign , nonatomic) CGFloat lastTranslation;
@property (assign , nonatomic) FSCalendarScope calendarScope;
@property (strong , nonatomic) NSDate *calendarCurrentPage;
- (void)performTransitionCompletionAnimated:(BOOL)animated;
@ -39,7 +38,7 @@
@end
@implementation FSCalendarAnimator
@implementation FSCalendarTransitionCoordinator
- (instancetype)initWithCalendar:(FSCalendar *)calendar
{
@ -152,7 +151,6 @@
self.lastTranslation = [panGesture translationInView:panGesture.view].y;
if (self.transition == FSCalendarTransitionWeekToMonth) {
self.calendarScope = FSCalendarScopeMonth;
self.calendarCurrentPage = self.pendingAttributes.targetPage;
[self prelayoutForWeekToMonthTransition];
@ -172,9 +170,6 @@
CGFloat minTranslation = CGRectGetHeight(self.pendingAttributes.targetBounds) - CGRectGetHeight(self.pendingAttributes.sourceBounds);
translation = MAX(minTranslation, translation);
translation = MIN(0, translation);
if (minTranslation == 0) {
NSLog(@"000");
}
CGFloat progress = translation/minTranslation;
[CATransaction begin];
[CATransaction setDisableActions:YES];
@ -217,15 +212,17 @@
translation = MIN(0, translation);
CGFloat progress = translation/minTranslation;
[self.calendar willChangeValueForKey:@"scope"];
if (velocity >= 0) {
[self.calendar fs_setUnsignedIntegerVariable:FSCalendarScopeMonth forKey:@"_scope"];
[self performBackwardTransition:self.transition fromProgress:progress];
} else {
[self.calendar fs_setUnsignedIntegerVariable:FSCalendarScopeWeek forKey:@"_scope"];
[self performForwardTransition:self.transition fromProgress:progress];
}
[self.calendar didChangeValueForKey:@"scope"];
break;
}
case FSCalendarTransitionWeekToMonth: {
@ -234,15 +231,16 @@
translation = MIN(maxTranslation, translation);
CGFloat progress = translation/maxTranslation;
[self.calendar willChangeValueForKey:@"scope"];
if (velocity >= 0) {
[self.calendar fs_setUnsignedIntegerVariable:FSCalendarScopeMonth forKey:@"_scope"];
[self performForwardTransition:self.transition fromProgress:progress];
} else {
[self.calendar fs_setUnsignedIntegerVariable:FSCalendarScopeWeek forKey:@"_scope"];
[self performBackwardTransition:self.transition fromProgress:progress];
}
[self.calendar didChangeValueForKey:@"scope"];
break;
}
default:
@ -266,7 +264,7 @@
}
// Start transition
self.state = FSCalendarTransitionStateChanging;
self.state = FSCalendarTransitionStateFinishing;
FSCalendarTransitionAttributes *attr = self.transitionAttributes;
self.pendingAttributes = attr;
@ -348,7 +346,7 @@
- (void)performBoundingRectTransitionFromMonth:(NSDate *)fromMonth toMonth:(NSDate *)toMonth duration:(CGFloat)duration
{
if (self.calendarScope != FSCalendarScopeMonth) return;
if (self.calendar.scope != FSCalendarScopeMonth) return;
NSInteger lastRowCount = [self.calendar.calculator numberOfRowsInMonth:fromMonth];
NSInteger currentRowCount = [self.calendar.calculator numberOfRowsInMonth:toMonth];
if (lastRowCount != currentRowCount) {
@ -499,16 +497,17 @@
#pragma mark - Private properties
- (void)setCalendarScope:(FSCalendarScope)calendarScope
- (FSCalendarScope)representingScope
{
[self.calendar willChangeValueForKey:@"scope"];
[self.calendar fs_setUnsignedIntegerVariable:calendarScope forKey:@"_scope"];
[self.calendar didChangeValueForKey:@"scope"];
}
- (FSCalendarScope)calendarScope
{
return self.calendar.scope;
switch (self.state) {
case FSCalendarTransitionStateIdle: {
return self.calendar.scope;
}
case FSCalendarTransitionStateChanging:
case FSCalendarTransitionStateFinishing: {
return FSCalendarScopeMonth;
}
}
}
- (void)setCalendarCurrentPage:(NSDate *)calendarCurrentPage
@ -563,7 +562,6 @@
switch (transition) {
case FSCalendarTransitionMonthToWeek: {
self.calendarScope = FSCalendarScopeWeek;
self.calendarCurrentPage = attr.targetPage;
self.calendar.contentView.clipsToBounds = YES;
@ -587,8 +585,6 @@
}
case FSCalendarTransitionWeekToMonth: {
self.calendarScope = FSCalendarScopeMonth;
[self performAlphaAnimationFrom:progress to:1 duration:0.4 exception:attr.focusedRowNumber completion:^{
[self performTransitionCompletionAnimated:YES];
}];
@ -641,7 +637,6 @@
case FSCalendarTransitionWeekToMonth: {
[self performAlphaAnimationFrom:progress to:0 duration:0.3 exception:self.pendingAttributes.focusedRowNumber completion:^{
self.calendarScope = FSCalendarScopeWeek;
self.calendarCurrentPage = self.pendingAttributes.sourcePage;
[self performTransitionCompletion:FSCalendarTransitionMonthToWeek animated:YES];