Created
January 7, 2014 23:11
-
-
Save kenshin03/8308652 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// PSHCoverFeedViewController.m | |
// SocialHome | |
// | |
// Created by Kenny Tang on 4/14/13. | |
// Copyright (c) 2013 corgitoergosum.net. All rights reserved. | |
// | |
#import "FeedItem.h" | |
#import "ItemSource.h" | |
#import "PSHCoverFeedViewController.h" | |
#import "PSHCoverFeedPageViewController.h" | |
#import "PSHFacebookDataService.h" | |
#import "PSHMenuViewController.h" | |
#import "PSHMessagingViewController.h" | |
@interface PSHCoverFeedViewController ()< | |
UIPageViewControllerDataSource, | |
PSHMenuViewControllerDelegate, | |
PSHCoverFeedPageViewControllerDelegate, | |
PSHMessagingViewControllerDelegate | |
> | |
@property (nonatomic, strong) NSMutableArray * feedItemsArray; | |
@property (nonatomic, strong) UIPageViewController * feedsPageViewController; | |
@property (nonatomic, strong) NSDateFormatter * dateFormatter; | |
@property (nonatomic, strong) PSHCoverFeedPageViewController * currentPagePageViewController; | |
@property (nonatomic, strong) PSHMenuViewController * menuViewController; | |
@property (nonatomic, strong) UIView * menuView; | |
@property (nonatomic, strong) UIView * messagingView; | |
@property (nonatomic, strong) PSHFacebookDataService * facebookDataService; | |
@end | |
@implementation PSHCoverFeedViewController | |
#pragma mark - Public | |
#pragma mark - View lifecycle | |
- (void)viewDidLoad | |
{ | |
[super viewDidLoad]; | |
// animate menus | |
[self animateMenuOnStart]; | |
[self.menuViewController animateHideMenuButtons]; | |
} | |
- (void)didReceiveMemoryWarning | |
{ | |
[super didReceiveMemoryWarning]; | |
// Dispose of any resources that can be recreated. | |
} | |
#pragma mark - Initialization | |
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil | |
{ | |
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; | |
if (self) { | |
[self setupViewFrameBounds]; | |
[self setupNavigationBar]; | |
[self addSubviewTree]; | |
[self setUpCoverFlowPagesViewController]; | |
} | |
return self; | |
} | |
- (void)setupViewFrameBounds | |
{ | |
CGRect screenBounds = [[UIScreen mainScreen] bounds]; | |
self.view.frame = screenBounds; | |
} | |
- (void)setupNavigationBar | |
{ | |
self.navigationController.navigationBarHidden = YES; | |
self.navigationItem.hidesBackButton = YES; | |
} | |
- (void)addSubviewTree | |
{ | |
[self.view addSubview:self.menuViewController.view]; | |
[self.view bringSubviewToFront:self.menuViewController.view]; | |
} | |
#pragma mark - Private | |
#pragma mark - Private properties | |
- (NSDateFormatter*)dateFormatter | |
{ | |
if (!_dateFormatter) { | |
_dateFormatter = [[NSDateFormatter alloc] init]; | |
[_dateFormatter setDateFormat:@"MMMM d"]; | |
} | |
return _dateFormatter; | |
} | |
- (NSArray*)feedItemsArray | |
{ | |
if (!_feedItemsArray) { | |
_feedItemsArray = [@[] mutableCopy]; | |
} | |
return _feedItemsArray; | |
} | |
- (PSHFacebookDataService*)facebookDataService | |
{ | |
if (!_facebookDataService){ | |
_facebookDataService = [PSHFacebookDataService sharedService]; | |
} | |
return _facebookDataService; | |
} | |
- (UIPageViewController*)feedsPageViewController | |
{ | |
if (!_feedsPageViewController){ | |
_feedsPageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; | |
_feedsPageViewController.dataSource = self; | |
[self addChildViewController:_feedsPageViewController]; | |
[self.view addSubview:_feedsPageViewController.view]; | |
[_feedsPageViewController didMoveToParentViewController:self]; | |
} | |
return _feedsPageViewController; | |
} | |
-(PSHMenuViewController*) menuViewController | |
{ | |
if (!_menuViewController){ | |
_menuViewController = [[PSHMenuViewController alloc] init]; | |
_menuViewController.delegate = self; | |
[self addChildViewController:_menuViewController]; | |
[_menuViewController didMoveToParentViewController:self]; | |
self.menuView = _menuViewController.view; | |
[self.menuViewController animateHideMenuButtons]; | |
} | |
return _menuViewController; | |
} | |
#pragma mark - Initialization Helpers | |
- (void)animateMenuOnStart | |
{ | |
double delayInSeconds = 1.0; | |
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); | |
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ | |
[self animateHideMenu]; | |
}); | |
} | |
- (void)setUpCoverFlowPagesViewController | |
{ | |
if ([self.feedItemsArray count] == 0){ | |
// fail fast. do nothing | |
return; | |
} | |
// set up page view controllers | |
FeedItem * firstFeedItem = self.feedItemsArray[0]; | |
PSHCoverFeedPageViewController * currentPagePageViewController = [[PSHCoverFeedPageViewController alloc] init]; | |
currentPagePageViewController.feedType = firstFeedItem.type; | |
currentPagePageViewController.messageLabelString = firstFeedItem.message; | |
currentPagePageViewController.infoLabelString = [NSString stringWithFormat:@"%@ - %@", [self.dateFormatter stringFromDate:firstFeedItem.updatedTime], firstFeedItem.source.name]; | |
currentPagePageViewController.likesCount = [firstFeedItem.likesCount integerValue]; | |
currentPagePageViewController.commentsCount = [firstFeedItem.commentsCount integerValue]; | |
currentPagePageViewController.lastestCommentatorsString = firstFeedItem.latestCommentors; | |
currentPagePageViewController.feedItemGraphID = firstFeedItem.graphID; | |
currentPagePageViewController.feedType = firstFeedItem.type; | |
currentPagePageViewController.likedByMe = firstFeedItem.likedByMe.boolValue; | |
currentPagePageViewController.currentIndex = 0; | |
if (firstFeedItem.imageURL != nil){ | |
currentPagePageViewController.imageURLString = firstFeedItem.imageURL; | |
} | |
currentPagePageViewController.sourceName = firstFeedItem.source.name; | |
currentPagePageViewController.sourceAvartarImageURL = firstFeedItem.source.imageURL; | |
currentPagePageViewController.delegate = self; | |
[self.feedsPageViewController setViewControllers:@[currentPagePageViewController] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:^(BOOL finished) { | |
}]; | |
// override local gesture recognizers | |
self.view.gestureRecognizers = self.feedsPageViewController.gestureRecognizers; | |
} | |
#pragma mark - Animation helper methods | |
- (void) animateHideMenu { | |
CGRect destFrame = self.menuViewController.view.frame; | |
destFrame.origin.y = self.view.frame.size.height; | |
[UIView animateWithDuration:0.5f delay:0.0f options:UIViewAnimationOptionCurveEaseOut animations:^{ | |
self.menuViewController.view.frame = destFrame; | |
} completion:^(BOOL finished) { | |
[self.menuViewController animateHideMenuButtons]; | |
}]; | |
} | |
- (void) animateShowMenu { | |
[self.menuViewController animateHideMenuButtons]; | |
[self.menuViewController animateHideLauncher]; | |
CGRect originFrame = self.menuViewController.view.frame; | |
originFrame.origin.y = 0.0f; | |
CGRect destFrame = self.menuViewController.view.frame; | |
destFrame.origin.y = destFrame.size.height; | |
self.menuViewController.view.frame = destFrame; | |
[self.view bringSubviewToFront:self.menuViewController.view]; | |
[UIView animateWithDuration:0.3f delay:0.0f options:UIViewAnimationOptionCurveEaseOut animations:^{ | |
self.menuViewController.view.frame = originFrame; | |
} completion:^(BOOL finished) { | |
NSLog(@"done: %@", NSStringFromCGRect(self.menuViewController.view.frame)); | |
}]; | |
} | |
#pragma mark - UIPageViewController dataSource methods | |
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { | |
PSHCoverFeedPageViewController *currentViewController = (PSHCoverFeedPageViewController*) viewController; | |
NSInteger currentIndex = currentViewController.currentIndex; | |
// prev page | |
if (currentIndex == 0){ | |
return nil; | |
}else{ | |
NSInteger previousIndex = currentIndex - 1; | |
FeedItem * previousFeedItem = self.feedItemsArray[previousIndex]; | |
PSHCoverFeedPageViewController * prevPageViewController = [[PSHCoverFeedPageViewController alloc] init]; | |
prevPageViewController.feedType = previousFeedItem.type; | |
prevPageViewController.messageLabelString = previousFeedItem.message; | |
prevPageViewController.infoLabelString = [NSString stringWithFormat:@"%@ - %@", [self.dateFormatter stringFromDate:previousFeedItem.updatedTime], previousFeedItem.source.name]; | |
prevPageViewController.likesCount = [previousFeedItem.likesCount integerValue]; | |
prevPageViewController.commentsCount = [previousFeedItem.commentsCount integerValue]; | |
prevPageViewController.lastestCommentatorsString = previousFeedItem.latestCommentors; | |
prevPageViewController.feedItemGraphID = previousFeedItem.graphID; | |
prevPageViewController.feedType = previousFeedItem.type; | |
prevPageViewController.currentIndex = previousIndex; | |
prevPageViewController.likedByMe = previousFeedItem.likedByMe.boolValue; | |
if (previousFeedItem.imageURL != nil){ | |
prevPageViewController.imageURLString = previousFeedItem.imageURL; | |
} | |
prevPageViewController.sourceName = previousFeedItem.source.name; | |
prevPageViewController.sourceAvartarImageURL = previousFeedItem.source.imageURL; | |
prevPageViewController.delegate = self; | |
return prevPageViewController; | |
} | |
} | |
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { | |
PSHCoverFeedPageViewController *currentViewController = (PSHCoverFeedPageViewController*) viewController; | |
NSInteger currentIndex = currentViewController.currentIndex; | |
NSInteger nextIndex = currentIndex+1; | |
if (currentIndex < [self.feedItemsArray count]-1){ | |
FeedItem * nextFeedItem = self.feedItemsArray[nextIndex]; | |
PSHCoverFeedPageViewController * nextPageViewController = [[PSHCoverFeedPageViewController alloc] init]; | |
nextPageViewController.feedType = nextFeedItem.type; | |
nextPageViewController.messageLabelString = nextFeedItem.message; | |
nextPageViewController.infoLabelString = [NSString stringWithFormat:@"%@ - %@", [self.dateFormatter stringFromDate:nextFeedItem.updatedTime], nextFeedItem.source.name]; | |
nextPageViewController.likesCount = [nextFeedItem.likesCount integerValue]; | |
nextPageViewController.commentsCount = [nextFeedItem.commentsCount integerValue]; | |
nextPageViewController.lastestCommentatorsString = nextFeedItem.latestCommentors; | |
nextPageViewController.feedItemGraphID = nextFeedItem.graphID; | |
nextPageViewController.feedType = nextFeedItem.type; | |
nextPageViewController.currentIndex = nextIndex; | |
nextPageViewController.likedByMe = nextFeedItem.likedByMe.boolValue; | |
if (nextFeedItem.imageURL != nil){ | |
nextPageViewController.imageURLString = nextFeedItem.imageURL; | |
} | |
nextPageViewController.sourceName = nextFeedItem.source.name; | |
nextPageViewController.sourceAvartarImageURL = nextFeedItem.source.imageURL; | |
nextPageViewController.delegate = self; | |
return nextPageViewController; | |
}else{ | |
return nil; | |
} | |
} | |
#pragma mark - PSHMenuViewControllerDelegate methods | |
- (void)menuViewController:(PSHMenuViewController*)vc messagesButtonTapped:(BOOL)tapped { | |
[self animateHideMenu]; | |
PSHMessagingViewController * messagingViewController = [[PSHMessagingViewController alloc] init]; | |
messagingViewController.delegate = self; | |
[self addChildViewController:messagingViewController]; | |
self.messagingView = messagingViewController.view; | |
[messagingViewController didMoveToParentViewController:self]; | |
[self.view addSubview:messagingViewController.view]; | |
} | |
- (void)menuViewController:(PSHMenuViewController*)vc viewSwipedToLeft:(BOOL)tapped { | |
[self animateHideMenu]; | |
} | |
- (void)menuViewController:(PSHMenuViewController*)vc viewSwipedToRight:(BOOL)tapped { | |
[self animateHideMenu]; | |
} | |
- (void)menuViewController:(PSHMenuViewController*)vc menuViewTapped:(BOOL)tapped { | |
[self animateHideMenu]; | |
[[self.feedsPageViewController viewControllers] enumerateObjectsUsingBlock:^(PSHCoverFeedPageViewController * feedPageViewController, NSUInteger idx, BOOL *stop) { | |
if ([feedPageViewController respondsToSelector:@selector(animateShowActionsPanelView)]){ | |
[feedPageViewController animateShowActionsPanelView]; | |
} | |
}]; | |
} | |
- (void)menuViewController:(PSHMenuViewController*)vc reloadButtonTapped:(BOOL)tapped { | |
[self animateHideMenu]; | |
[self.feedItemsArray removeAllObjects]; | |
[self.feedsPageViewController.view removeFromSuperview]; | |
[self.feedsPageViewController removeFromParentViewController]; | |
self.feedsPageViewController = nil; | |
self.facebookDataService = [PSHFacebookDataService sharedService]; | |
[self.facebookDataService removeAllCachedFeeds:^{ | |
NSArray * feedItemsArray = [FeedItem findAllSortedBy:@"createdTime" ascending:NO]; | |
if ([feedItemsArray count] > 0){ | |
[self.feedItemsArray removeAllObjects]; | |
[self.feedItemsArray addObjectsFromArray:feedItemsArray]; | |
[self setUpCoverFlowPagesViewController]; | |
}else{ | |
self.facebookDataService = [PSHFacebookDataService sharedService]; | |
[self.facebookDataService fetchFeed:^(NSArray *resultsArray, NSError *error) { | |
dispatch_async(dispatch_get_main_queue(), ^{ | |
[self.feedItemsArray removeAllObjects]; | |
[self.feedItemsArray addObjectsFromArray:resultsArray]; | |
// reload page view controller | |
[self setUpCoverFlowPagesViewController]; | |
}); | |
}]; | |
} | |
[self.view bringSubviewToFront:self.menuView]; | |
}]; | |
} | |
#pragma mark - PSHCoverFeedPageViewControllerDelegate methods | |
- (void)coverfeedPageViewController:(PSHCoverFeedPageViewController*)vc mainViewTapped:(BOOL)tapped { | |
[self animateShowMenu]; | |
} | |
- (void)coverfeedPageViewController:(PSHCoverFeedPageViewController*)vc feedID:(NSString*)feedID unliked:(BOOL)unliked { | |
// unlike the feed | |
[self.feedItemsArray enumerateObjectsUsingBlock:^(FeedItem * feedItem, NSUInteger idx, BOOL *stop) { | |
if ([feedItem.graphID isEqualToString:feedID]){ | |
if (unliked){ | |
feedItem.likedByMe = [NSNumber numberWithBool:NO]; | |
}else{ | |
feedItem.likedByMe = [NSNumber numberWithBool:YES]; | |
} | |
} | |
}]; | |
} | |
#pragma mark - PSHMessagingViewControllerDelegate methods | |
- (void)messagingViewController:(PSHMessagingViewController*)vc messagingDissmissed:(BOOL)dismissed { | |
[self animateShowMenu]; | |
[self.messagingView removeFromSuperview]; | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment