Merge branch '1.6.4.beta'

This commit is contained in:
dingwenchao 2015-11-11 18:11:07 +08:00
parent ca46534ad9
commit 501b2718eb
12 changed files with 131 additions and 87 deletions

View File

@ -34,6 +34,7 @@
calendar.pagingEnabled = NO; // important
calendar.allowsMultipleSelection = YES;
calendar.backgroundColor = [UIColor whiteColor];
calendar.firstWeekday = 2;
calendar.appearance.caseOptions = FSCalendarCaseOptionsWeekdayUsesSingleUpperCase|FSCalendarCaseOptionsHeaderUsesUpperCase;
[self.view addSubview:calendar];
self.calendar = calendar;

View File

@ -61,6 +61,17 @@
@"2015-10-15",
@"2015-10-25"];
// Uncomment this to test the month->week & week->month transition
/*
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[_calendar setScope:FSCalendarScopeWeek animated:YES];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[_calendar setScope:FSCalendarScopeMonth animated:YES];
});
});
*/
#if 0
FSCalendarTestSelectDate
#endif

View File

@ -1,7 +1,7 @@
Pod::Spec.new do |s|
s.name = "FSCalendar"
s.version = "1.6.3"
s.version = "1.6.4"
s.summary = "Designed to build the best iOS calendar control."
s.homepage = "https://github.com/WenchaoIOS/FSCalendar"

View File

@ -65,7 +65,7 @@
@property (weak , nonatomic) FSCalendarHeader *header;
@property (weak , nonatomic) FSCalendarHeaderTouchDeliver *deliver;
@property (strong, nonatomic) NSCalendar *calendar;
@property (weak , nonatomic) NSCalendar *calendar;
@property (assign, nonatomic) BOOL ibEditing;
@property (assign, nonatomic) BOOL needsAdjustingMonthPosition;
@ -77,8 +77,8 @@
@property (assign, nonatomic) CGFloat preferedHeaderHeight;
@property (assign, nonatomic) CGFloat preferedWeekdayHeight;
@property (assign, nonatomic) CGFloat preferedRowHeight;
@property (assign, nonatomic) UIInterfaceOrientation interfaceOrientation;
@property (readonly, nonatomic) NSInteger currentSection;
@property (readonly, nonatomic) BOOL floatingMode;
@property (readonly, nonatomic) NSArray *visibleStickyHeaders;
@ -89,6 +89,7 @@
- (NSDate *)dateForIndexPath:(NSIndexPath *)indexPath;
- (NSIndexPath *)indexPathForDate:(NSDate *)date;
- (CGSize)sizeThatFits:(CGSize)size scope:(FSCalendarScope)scope;
- (void)scrollToDate:(NSDate *)date;
- (void)scrollToDate:(NSDate *)date animated:(BOOL)animated;
@ -171,6 +172,7 @@
_needsAdjustingViewFrame = YES;
_needsAdjustingTextSize = YES;
_stickyHeaderMapTable = [NSMapTable weakToWeakObjectsMapTable];
_interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation;
UIView *contentView = [[UIView alloc] initWithFrame:CGRectZero];
contentView.backgroundColor = [UIColor clearColor];
@ -178,6 +180,7 @@
self.contentView = contentView;
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.actions = @{@"path":[NSNull null]};
contentView.layer.mask = maskLayer;
self.maskLayer = maskLayer;
@ -220,6 +223,7 @@
[self invalidateLayout];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(significantTimeDidChange:) name:UIApplicationSignificantTimeChangeNotification object:nil];
}
@ -265,7 +269,7 @@
_deliver.frame = CGRectMake(_header.fs_left, _header.fs_top, _header.fs_width, headerHeight+weekdayHeight);
_deliver.hidden = _header.hidden;
if (_pagingEnabled) {
if (!self.floatingMode) {
switch (_scope) {
case FSCalendarScopeMonth: {
@ -299,22 +303,21 @@
[_appearance adjustTitleIfNecessary];
}
if (_needsReloadingSelectingDates) {
_needsReloadingSelectingDates = NO;
[_selectedDates enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[self selectDate:obj scrollToDate:NO];
}];
}
if (_needsAdjustingMonthPosition) {
_needsAdjustingMonthPosition = NO;
[self scrollToDate:_pagingEnabled?_currentPage:(_currentPage?:self.selectedDate)];
}
if (_needsLayoutForWeekMode) {
_needsLayoutForWeekMode = NO;
_scope = FSCalendarScopeWeek;
[self performScopeTransitionFromScope:FSCalendarScopeMonth toScope:FSCalendarScopeWeek animated:NO];
} else {
if (_needsReloadingSelectingDates) {
_needsReloadingSelectingDates = NO;
[_selectedDates enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[self selectDate:obj scrollToDate:NO];
}];
}
if (_needsAdjustingMonthPosition) {
_needsAdjustingMonthPosition = NO;
[self scrollToDate:_pagingEnabled?_currentPage:(_currentPage?:self.selectedDate)];
}
}
_supressEvent = NO;
@ -355,14 +358,19 @@
}
- (CGSize)sizeThatFits:(CGSize)size
{
return [self sizeThatFits:size scope:_scope];
}
- (CGSize)sizeThatFits:(CGSize)size scope:(FSCalendarScope)scope
{
CGFloat headerHeight = self.preferedHeaderHeight;
CGFloat weekdayHeight = self.preferedWeekdayHeight;
CGFloat rowHeight = self.preferedRowHeight;
CGFloat paddings = weekdayHeight * 0.2;
if (!self.floatingMode) {
switch (_scope) {
switch (scope) {
case FSCalendarScopeMonth: {
CGFloat height = weekdayHeight + headerHeight + 6*rowHeight + paddings;
return CGSizeMake(size.width, height);
@ -415,10 +423,9 @@
}
} else {
NSDate *currentPage = [_minimumDate.fs_firstDayOfMonth fs_dateByAddingMonths:section];
NSDate *firstDayOfMonth = [NSDate fs_dateWithYear:currentPage.fs_year
month:currentPage.fs_month
day:1];
NSInteger numberOfRows = (firstDayOfMonth.fs_weekday-_calendar.firstWeekday+currentPage.fs_numberOfDaysInMonth)/7 + ((firstDayOfMonth.fs_weekday-_calendar.firstWeekday+currentPage.fs_numberOfDaysInMonth)%7 !=0 );
NSDate *firstDayOfMonth = currentPage.fs_firstDayOfMonth;
NSInteger numberOfPlaceholdersForPrev = (firstDayOfMonth.fs_weekday-_calendar.firstWeekday + 7) % 7;
NSInteger numberOfRows = (numberOfPlaceholdersForPrev+firstDayOfMonth.fs_numberOfDaysInMonth)/7 + ((numberOfPlaceholdersForPrev+firstDayOfMonth.fs_numberOfDaysInMonth)%7!=0);
return numberOfRows * 7;
}
return 7;
@ -650,15 +657,7 @@
- (void)orientationDidChange:(NSNotification *)notification
{
_needsAdjustingViewFrame = YES;
_needsAdjustingMonthPosition = YES;
_needsAdjustingTextSize = YES;
[_collectionViewLayout invalidateLayout]; // Necessary in Swift. Anyone can tell why?
[_stickyHeaderMapTable.dictionaryRepresentation.allValues setValue:@YES forKey:@"needsAdjustingFrames"];
_preferedWeekdayHeight = FSCalendarAutomaticDimension;
_preferedRowHeight = FSCalendarAutomaticDimension;
_preferedHeaderHeight = FSCalendarAutomaticDimension;
[self setNeedsLayout];
self.interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation;
}
- (void)significantTimeDidChange:(NSNotification *)notification
@ -724,7 +723,7 @@
{
if (_firstWeekday != firstWeekday) {
_firstWeekday = firstWeekday;
[_calendar setFirstWeekday:firstWeekday];
_calendar.firstWeekday = firstWeekday;
[_collectionView reloadData];
[self invalidateWeekdaySymbols];
}
@ -807,9 +806,12 @@
- (void)setLocale:(NSLocale *)locale
{
if (![_calendar.locale isEqual:locale]) {
_calendar.locale = locale;
_header.dateFormatter.locale = locale;
// Everything needs to be relocaled
[NSCalendar fs_sharedCalendar].locale = locale;
[NSDateFormatter fs_sharedDateFormatter].locale = locale;
// End
[_header reloadData];
[_stickyHeaderMapTable.dictionaryRepresentation.allValues makeObjectsPerformSelector:@selector(setNeedsLayout)];
[self invalidateWeekdaySymbols];
}
}
@ -819,22 +821,6 @@
return _calendar.locale;
}
- (NSInteger)currentSection
{
switch (_scope) {
case FSCalendarScopeMonth: {
return [_currentPage fs_monthsFrom:_minimumDate.fs_firstDayOfMonth];
}
case FSCalendarScopeWeek: {
return [_currentPage fs_weeksFrom:_minimumDate.fs_firstDayOfWeek];
}
default: {
break;
}
}
return 0;
}
- (void)setAllowsMultipleSelection:(BOOL)allowsMultipleSelection
{
_collectionView.allowsMultipleSelection = allowsMultipleSelection;
@ -876,6 +862,26 @@
}
}
- (void)setInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if (_interfaceOrientation != interfaceOrientation) {
_interfaceOrientation = interfaceOrientation;
if (interfaceOrientation != UIInterfaceOrientationUnknown) {
_needsAdjustingViewFrame = YES;
_needsAdjustingMonthPosition = YES;
_needsAdjustingTextSize = YES;
[_collectionViewLayout invalidateLayout]; // Necessary in Swift. Anyone can tell why?
[_stickyHeaderMapTable.dictionaryRepresentation.allValues setValue:@YES forKey:@"needsAdjustingFrames"];
_preferedWeekdayHeight = FSCalendarAutomaticDimension;
_preferedRowHeight = FSCalendarAutomaticDimension;
_preferedHeaderHeight = FSCalendarAutomaticDimension;
[self setNeedsLayout];
}
}
}
- (NSDate *)selectedDate
{
return _selectedDates.lastObject;
@ -1015,7 +1021,8 @@
- (void)performScopeTransitionFromScope:(FSCalendarScope)fromScope toScope:(FSCalendarScope)toScope animated:(BOOL)animated
{
NSInteger section = self.currentSection;
BOOL weekToMonth = fromScope == FSCalendarScopeWeek && toScope == FSCalendarScopeMonth;
BOOL monthToWeek = !weekToMonth;
void(^completion)(void) = ^{
switch (toScope) {
case FSCalendarScopeMonth: {
@ -1032,6 +1039,7 @@
break;
}
}
[_collectionView reloadData];
[_header reloadData];
_needsAdjustingMonthPosition = YES;
@ -1040,7 +1048,6 @@
[self setNeedsLayout];
};
BOOL weekToMonth = fromScope == FSCalendarScopeWeek && toScope == FSCalendarScopeMonth;
NSInteger rowNumber = -1;
if (weekToMonth) {
@ -1074,20 +1081,28 @@
} else {
FSCalendarCell *cell = (FSCalendarCell *)[_collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:section]];
_currentPage = cell.date ?: _today;
NSInteger visibleSection = [_currentPage fs_monthsFrom:_minimumDate.fs_firstDayOfMonth];
NSIndexPath *firstIndexPath = [NSIndexPath indexPathForItem:0 inSection:visibleSection];
NSDate *firstDateForWeekMode = [self dateForIndexPath:firstIndexPath scope:fromScope];
_currentPage = firstDateForWeekMode;
}
void(^resizeBlock)() = ^{
CGSize size = [self sizeThatFits:self.frame.size];
_daysContainer.clipsToBounds = YES;
CGSize size = [self sizeThatFits:self.frame.size scope:toScope];
void(^transitionCompletion)() = ^{
_daysContainer.clipsToBounds = NO;
_maskLayer.path = [UIBezierPath bezierPathWithRect:(CGRect){CGPointZero,size}].CGPath;
if (!weekToMonth) {
completion();
if (monthToWeek) {
if (animated) {
dispatch_async(dispatch_get_main_queue(), ^{
completion();
});
} else {
completion();
}
}
_contentView.clipsToBounds = NO;
};
if (animated) {
@ -1130,25 +1145,23 @@
} else {
_needsAdjustingViewFrame = weekToMonth;
_needsAdjustingViewFrame = YES;
_bottomBorder.frame = CGRectMake(0, size.height, self.fs_width, 1);
transitionCompletion();
if (_delegate && [_delegate respondsToSelector:@selector(calendarCurrentScopeWillChange:animated:)]) {
[_delegate calendarCurrentScopeWillChange:self animated:animated];
}
}
};
if (animated) {
dispatch_async(dispatch_get_main_queue(), ^{
resizeBlock();
});
} else {
_contentView.clipsToBounds = YES;
dispatch_async(dispatch_get_main_queue(), ^{
resizeBlock();
}
});
}
- (void)selectDate:(NSDate *)date
@ -1351,9 +1364,9 @@
}
}
- (NSDate *)dateForIndexPath:(NSIndexPath *)indexPath
- (NSDate *)dateForIndexPath:(NSIndexPath *)indexPath scope:(FSCalendarScope)scope
{
switch (_scope) {
switch (scope) {
case FSCalendarScopeMonth: {
NSDate *currentPage = [_minimumDate.fs_firstDayOfMonth fs_dateByAddingMonths:indexPath.section];
NSDate *firstDayOfMonth = currentPage.fs_firstDayOfMonth;
@ -1384,6 +1397,11 @@
return nil;
}
- (NSDate *)dateForIndexPath:(NSIndexPath *)indexPath
{
return [self dateForIndexPath:indexPath scope:_scope];
}
- (NSIndexPath *)indexPathForDate:(NSDate *)date
{
NSInteger item = 0;

View File

@ -51,7 +51,6 @@
@interface FSCalendarHeader (Dynamic)
@property (readonly, nonatomic) UICollectionView *collectionView;
@property (readonly, nonatomic) NSDateFormatter *dateFormatter;
@end

View File

@ -15,7 +15,7 @@
@interface FSCalendarHeader ()<UICollectionViewDataSource,UICollectionViewDelegate>
@property (copy, nonatomic) NSDateFormatter *dateFormatter;
@property (weak, nonatomic) NSDateFormatter *dateFormatter;
@property (weak, nonatomic) UICollectionViewFlowLayout *collectionViewFlowLayout;
@property (assign, nonatomic) BOOL needsAdjustingMonthPosition;
@ -48,7 +48,7 @@
- (void)initialize
{
_dateFormatter = [[NSDateFormatter alloc] init];
_dateFormatter = [NSDateFormatter fs_sharedDateFormatter];
_scrollDirection = UICollectionViewScrollDirectionHorizontal;
_scrollEnabled = YES;
@ -167,7 +167,7 @@
if ((indexPath.item == 0 || indexPath.item == [collectionView numberOfItemsInSection:0] - 1)) {
text = nil;
} else {
NSDate *date = [self.calendar.minimumDate.fs_firstDayOfWeek fs_dateByAddingWeeks:indexPath.item - 1].fs_dateByIgnoringTimeComponents;
NSDate *date = [self.calendar.minimumDate.fs_middleOfWeek fs_dateByAddingWeeks:indexPath.item - 1].fs_dateByIgnoringTimeComponents;
text = [_dateFormatter stringFromDate:date];
}
break;

View File

@ -15,8 +15,8 @@
@property (weak, nonatomic) FSCalendar *calendar;
@property (weak, nonatomic) FSCalendarAppearance *appearance;
@property (weak, nonatomic) UILabel *titleLabel;
@property (strong, nonatomic) NSArray *weekdayLabels;
@property (strong, nonatomic) NSArray *weekdayLabels;
@property (strong, nonatomic) NSDate *month;
@end

View File

@ -18,7 +18,7 @@
@property (weak, nonatomic) UIView *contentView;
@property (weak, nonatomic) UIView *separator;
@property (strong, nonatomic) NSDateFormatter *dateFormatter;
@property (weak, nonatomic) NSDateFormatter *dateFormatter;
@property (assign, nonatomic) BOOL needsReloadingAppearance;
@property (assign, nonatomic) BOOL needsAdjustingFrames;
@ -35,9 +35,9 @@
self = [super initWithFrame:frame];
if (self) {
self.dateFormatter = [[NSDateFormatter alloc] init];
self.needsReloadingAppearance = YES;
self.needsAdjustingFrames = YES;
_dateFormatter = [NSDateFormatter fs_sharedDateFormatter];
_needsReloadingAppearance = YES;
_needsAdjustingFrames = YES;
UIView *view = [[UIView alloc] initWithFrame:CGRectZero];
view.backgroundColor = [UIColor clearColor];

View File

@ -15,7 +15,7 @@
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.6.1</string>
<string>1.6.4</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>

View File

@ -23,6 +23,7 @@
@property (readonly, nonatomic) NSDate *fs_firstDayOfMonth;
@property (readonly, nonatomic) NSDate *fs_lastDayOfMonth;
@property (readonly, nonatomic) NSDate *fs_firstDayOfWeek;
@property (readonly, nonatomic) NSDate *fs_middleOfWeek;
@property (readonly, nonatomic) NSDate *fs_tomorrow;
@property (readonly, nonatomic) NSDate *fs_yesterday;
@property (readonly, nonatomic) NSInteger fs_numberOfDaysInMonth;

View File

@ -108,6 +108,19 @@
return beginningOfWeek;
}
- (NSDate *)fs_middleOfWeek
{
NSCalendar *calendar = [NSCalendar fs_sharedCalendar];
NSDateComponents *weekdayComponents = [calendar components:NSCalendarUnitWeekday fromDate:self];
NSDateComponents *componentsToSubtract = [NSDateComponents fs_sharedDateComponents];
componentsToSubtract.day = - (weekdayComponents.weekday - calendar.firstWeekday) + 3;
NSDate *middleOfWeek = [calendar dateByAddingComponents:componentsToSubtract toDate:self options:0];
NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:middleOfWeek];
middleOfWeek = [calendar dateFromComponents:components];
componentsToSubtract.day = NSIntegerMax;
return middleOfWeek;
}
- (NSDate *)fs_tomorrow
{
NSCalendar *calendar = [NSCalendar fs_sharedCalendar];

View File

@ -17,16 +17,16 @@ class ViewController: UIViewController, FSCalendarDataSource, FSCalendarDelegate
super.viewDidLoad()
calendar.scrollDirection = .Vertical
calendar.appearance.caseOptions = [.HeaderUsesUpperCase,.WeekdayUsesUpperCase]
calendar.selectDate(NSDate())
// calendar.allowsMultipleSelection = true
// Uncomment this to test month->week and week->month transition
/*
calendar.allowsMultipleSelection = true
var dateArray = ["20160101", "20151115", "20151211", "20151201", "20151107", "20160105"]
for (var i = 0 ; i < dateArray.count; i++) {
let dateString = dateArray[i] as NSString
let date = dateString.fs_dateWithFormat("yyyyMMdd");
calendar.selectDate(date)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(1.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
self.calendar.setScope(.Week, animated: true)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(1.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
self.calendar.setScope(.Month, animated: true)
}
}
*/
@ -56,6 +56,7 @@ class ViewController: UIViewController, FSCalendarDataSource, FSCalendarDelegate
func calendarCurrentScopeWillChange(calendar: FSCalendar!, animated: Bool) {
calendarHeightConstraint.constant = calendar.sizeThatFits(CGSizeZero).height
view.layoutIfNeeded()
}
func calendar(calendar: FSCalendar!, imageForDate date: NSDate!) -> UIImage! {