209 lines
6.6 KiB
Objective-C
209 lines
6.6 KiB
Objective-C
//
|
|
// RangePickerViewController.m
|
|
// FSCalendar
|
|
//
|
|
// Created by dingwenchao on 5/8/16.
|
|
// Copyright © 2016 Wenchao Ding. All rights reserved.
|
|
//
|
|
|
|
#import "RangePickerViewController.h"
|
|
#import "FSCalendar.h"
|
|
#import "RangePickerCell.h"
|
|
#import "FSCalendarExtensions.h"
|
|
|
|
@interface RangePickerViewController () <FSCalendarDataSource,FSCalendarDelegate,FSCalendarDelegateAppearance>
|
|
|
|
@property (weak, nonatomic) FSCalendar *calendar;
|
|
|
|
@property (weak, nonatomic) UILabel *eventLabel;
|
|
@property (strong, nonatomic) NSCalendar *gregorian;
|
|
@property (strong, nonatomic) NSDateFormatter *dateFormatter;
|
|
|
|
// The start date of the range
|
|
@property (strong, nonatomic) NSDate *date1;
|
|
// The end date of the range
|
|
@property (strong, nonatomic) NSDate *date2;
|
|
|
|
- (void)configureCell:(__kindof FSCalendarCell *)cell forDate:(NSDate *)date atMonthPosition:(FSCalendarMonthPosition)position;
|
|
|
|
@end
|
|
|
|
@implementation RangePickerViewController
|
|
|
|
- (instancetype)init
|
|
{
|
|
self = [super init];
|
|
if (self) {
|
|
self.title = @"FSCalendar";
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)loadView
|
|
{
|
|
UIView *view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
|
|
view.backgroundColor = [UIColor whiteColor];
|
|
self.view = view;
|
|
|
|
FSCalendar *calendar = [[FSCalendar alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(self.navigationController.navigationBar.frame), view.frame.size.width, view.frame.size.height - CGRectGetMaxY(self.navigationController.navigationBar.frame))];
|
|
calendar.dataSource = self;
|
|
calendar.delegate = self;
|
|
calendar.pagingEnabled = NO;
|
|
calendar.allowsMultipleSelection = YES;
|
|
calendar.rowHeight = 60;
|
|
calendar.placeholderType = FSCalendarPlaceholderTypeNone;
|
|
[view addSubview:calendar];
|
|
self.calendar = calendar;
|
|
|
|
calendar.appearance.titleDefaultColor = [UIColor blackColor];
|
|
calendar.appearance.headerTitleColor = [UIColor blackColor];
|
|
calendar.appearance.titleFont = [UIFont systemFontOfSize:16];
|
|
calendar.weekdayHeight = 0;
|
|
|
|
calendar.swipeToChooseGesture.enabled = YES;
|
|
|
|
calendar.today = nil; // Hide the today circle
|
|
[calendar registerClass:[RangePickerCell class] forCellReuseIdentifier:@"cell"];
|
|
|
|
}
|
|
|
|
- (void)viewDidLoad
|
|
{
|
|
[super viewDidLoad];
|
|
|
|
self.gregorian = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
|
|
self.dateFormatter = [[NSDateFormatter alloc] init];
|
|
self.dateFormatter.dateFormat = @"yyyy-MM-dd";
|
|
|
|
// Uncomment this to perform an 'initial-week-scope'
|
|
// self.calendar.scope = FSCalendarScopeWeek;
|
|
|
|
// For UITest
|
|
self.calendar.accessibilityIdentifier = @"calendar";
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
NSLog(@"%s",__FUNCTION__);
|
|
}
|
|
|
|
#pragma mark - FSCalendarDataSource
|
|
|
|
- (NSDate *)minimumDateForCalendar:(FSCalendar *)calendar
|
|
{
|
|
return [self.dateFormatter dateFromString:@"2016-07-08"];
|
|
}
|
|
|
|
- (NSDate *)maximumDateForCalendar:(FSCalendar *)calendar
|
|
{
|
|
return [self.gregorian dateByAddingUnit:NSCalendarUnitMonth value:10 toDate:[NSDate date] options:0];
|
|
}
|
|
|
|
- (NSString *)calendar:(FSCalendar *)calendar titleForDate:(NSDate *)date
|
|
{
|
|
if ([self.gregorian isDateInToday:date]) {
|
|
return @"今";
|
|
}
|
|
return nil;
|
|
}
|
|
|
|
- (FSCalendarCell *)calendar:(FSCalendar *)calendar cellForDate:(NSDate *)date atMonthPosition:(FSCalendarMonthPosition)monthPosition
|
|
{
|
|
RangePickerCell *cell = [calendar dequeueReusableCellWithIdentifier:@"cell" forDate:date atMonthPosition:monthPosition];
|
|
return cell;
|
|
}
|
|
|
|
- (void)calendar:(FSCalendar *)calendar willDisplayCell:(FSCalendarCell *)cell forDate:(NSDate *)date atMonthPosition: (FSCalendarMonthPosition)monthPosition
|
|
{
|
|
[self configureCell:cell forDate:date atMonthPosition:monthPosition];
|
|
}
|
|
|
|
#pragma mark - FSCalendarDelegate
|
|
|
|
- (BOOL)calendar:(FSCalendar *)calendar shouldSelectDate:(NSDate *)date atMonthPosition:(FSCalendarMonthPosition)monthPosition
|
|
{
|
|
return monthPosition == FSCalendarMonthPositionCurrent;
|
|
}
|
|
|
|
- (BOOL)calendar:(FSCalendar *)calendar shouldDeselectDate:(NSDate *)date atMonthPosition:(FSCalendarMonthPosition)monthPosition
|
|
{
|
|
return NO;
|
|
}
|
|
|
|
- (void)calendar:(FSCalendar *)calendar didSelectDate:(NSDate *)date atMonthPosition:(FSCalendarMonthPosition)monthPosition
|
|
{
|
|
|
|
if (calendar.swipeToChooseGesture.state == UIGestureRecognizerStateChanged) {
|
|
// If the selection is caused by swipe gestures
|
|
if (!self.date1) {
|
|
self.date1 = date;
|
|
} else {
|
|
if (self.date2) {
|
|
[calendar deselectDate:self.date2];
|
|
}
|
|
self.date2 = date;
|
|
}
|
|
} else {
|
|
if (self.date2) {
|
|
[calendar deselectDate:self.date1];
|
|
[calendar deselectDate:self.date2];
|
|
self.date1 = date;
|
|
self.date2 = nil;
|
|
} else if (!self.date1) {
|
|
self.date1 = date;
|
|
} else {
|
|
self.date2 = date;
|
|
}
|
|
}
|
|
|
|
[self configureVisibleCells];
|
|
}
|
|
|
|
- (void)calendar:(FSCalendar *)calendar didDeselectDate:(NSDate *)date atMonthPosition:(FSCalendarMonthPosition)monthPosition
|
|
{
|
|
NSLog(@"did deselect date %@",[self.dateFormatter stringFromDate:date]);
|
|
[self configureVisibleCells];
|
|
}
|
|
|
|
- (NSArray<UIColor *> *)calendar:(FSCalendar *)calendar appearance:(FSCalendarAppearance *)appearance eventDefaultColorsForDate:(NSDate *)date
|
|
{
|
|
if ([self.gregorian isDateInToday:date]) {
|
|
return @[[UIColor orangeColor]];
|
|
}
|
|
return @[appearance.eventDefaultColor];
|
|
}
|
|
|
|
#pragma mark - Private methods
|
|
|
|
- (void)configureVisibleCells
|
|
{
|
|
[self.calendar.visibleCells enumerateObjectsUsingBlock:^(__kindof FSCalendarCell * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
|
|
NSDate *date = [self.calendar dateForCell:obj];
|
|
FSCalendarMonthPosition position = [self.calendar monthPositionForCell:obj];
|
|
[self configureCell:obj forDate:date atMonthPosition:position];
|
|
}];
|
|
}
|
|
|
|
- (void)configureCell:(__kindof FSCalendarCell *)cell forDate:(NSDate *)date atMonthPosition:(FSCalendarMonthPosition)position
|
|
{
|
|
RangePickerCell *rangeCell = cell;
|
|
if (position != FSCalendarMonthPositionCurrent) {
|
|
rangeCell.middleLayer.hidden = YES;
|
|
rangeCell.selectionLayer.hidden = YES;
|
|
return;
|
|
}
|
|
if (self.date1 && self.date2) {
|
|
// The date is in the middle of the range
|
|
BOOL isMiddle = [date compare:self.date1] != [date compare:self.date2];
|
|
rangeCell.middleLayer.hidden = !isMiddle;
|
|
} else {
|
|
rangeCell.middleLayer.hidden = YES;
|
|
}
|
|
BOOL isSelected = NO;
|
|
isSelected |= self.date1 && [self.gregorian isDate:date inSameDayAsDate:self.date1];
|
|
isSelected |= self.date2 && [self.gregorian isDate:date inSameDayAsDate:self.date2];
|
|
rangeCell.selectionLayer.hidden = !isSelected;
|
|
}
|
|
|
|
@end
|