FSCalendar/Example-Objc/FSCalendarScopeExampleViewC...

154 lines
5.1 KiB
Objective-C

//
// FSCalendarScopeExampleViewController.m
// FSCalendar
//
// Created by Wenchao Ding on 8/29/15.
// Copyright (c) 2015 Wenchao Ding. All rights reserved.
//
#import "FSCalendarScopeExampleViewController.h"
static void * __KVOContext;
@implementation FSCalendarScopeExampleViewController
#pragma mark - Life cycle
- (void)viewDidLoad
{
[super viewDidLoad];
self.dateFormatter = [[NSDateFormatter alloc] init];
self.dateFormatter.dateFormat = @"yyyy/MM/dd";
[_calendar selectDate:[NSDate date]];
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self.calendar action:@selector(handleScopeGesture:)];
panGesture.delegate = self;
panGesture.minimumNumberOfTouches = 1;
panGesture.maximumNumberOfTouches = 2;
[self.view addGestureRecognizer:panGesture];
self.scopeGesture = panGesture;
// While the scope gesture begin, the pan gesture of tableView should cancel.
[self.tableView.panGestureRecognizer requireGestureRecognizerToFail:panGesture];
self.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
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
BOOL shouldBegin = self.tableView.contentOffset.y <= -self.tableView.contentInset.top;
if (shouldBegin) {
CGPoint velocity = [self.scopeGesture velocityInView:self.view];
switch (self.calendar.scope) {
case FSCalendarScopeMonth:
return velocity.y < 0;
case FSCalendarScopeWeek:
return velocity.y > 0;
}
}
return shouldBegin;
}
- (void)calendar:(FSCalendar *)calendar boundingRectWillChange:(CGRect)bounds animated:(BOOL)animated
{
_calendarHeightConstraint.constant = CGRectGetHeight(bounds);
[self.view layoutIfNeeded];
}
- (void)calendar:(FSCalendar *)calendar didSelectDate:(NSDate *)date atMonthPosition:(FSCalendarMonthPosition)monthPosition
{
NSLog(@"did select date %@",[self.dateFormatter stringFromDate:date]);
NSMutableArray *selectedDates = [NSMutableArray arrayWithCapacity:calendar.selectedDates.count];
[calendar.selectedDates enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[selectedDates addObject:[self.dateFormatter stringFromDate:obj]];
}];
NSLog(@"selected dates is %@",selectedDates);
if (monthPosition == FSCalendarMonthPositionNext || monthPosition == FSCalendarMonthPositionPrevious) {
[calendar setCurrentPage:date animated:YES];
}
}
- (void)calendarCurrentPageDidChange:(FSCalendar *)calendar
{
NSLog(@"%s %@", __FUNCTION__, [self.dateFormatter stringFromDate:calendar.currentPage]);
}
#pragma mark - <UITableViewDataSource>
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSInteger numbers[2] = {2,20};
return numbers[section];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0) {
NSString *identifier = @[@"cell_month",@"cell_week"][indexPath.row];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
return cell;
} else {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
return cell;
}
}
#pragma mark - <UITableViewDelegate>
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if (indexPath.section == 0) {
FSCalendarScope selectedScope = indexPath.row == 0 ? FSCalendarScopeMonth : FSCalendarScopeWeek;
[self.calendar setScope:selectedScope animated:self.animationSwitch.on];
}
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 20;
}
- (IBAction)toggleClicked:(id)sender
{
if (self.calendar.scope == FSCalendarScopeMonth) {
[self.calendar setScope:FSCalendarScopeWeek animated:_animationSwitch.on];
} else {
[self.calendar setScope:FSCalendarScopeMonth animated:_animationSwitch.on];
}
}
@end