NewsBlur/media/ios/Classes/NBContainerViewController.m

228 lines
11 KiB
Mathematica
Raw Normal View History

//
// NBContainerViewController.m
// NewsBlur
//
// Created by Roy Yang on 7/24/12.
// Copyright (c) 2012 NewsBlur. All rights reserved.
//
#import "NBContainerViewController.h"
#import "NewsBlurViewController.h"
#import "FeedDetailViewController.h"
#import "DashboardViewController.h"
#import "StoryDetailViewController.h"
#import "ShareViewController.h"
#define NB_DEFAULT_MASTER_WIDTH 270
#define NB_DEFAULT_STORY_TITLE_HEIGHT 250
2012-07-24 16:03:16 -07:00
#define NB_DEFAULT_SLIDER_INTERVAL 0.4
@interface NBContainerViewController ()
@property (nonatomic, strong) UINavigationController *masterNavigationController;
@property (nonatomic, strong) NewsBlurViewController *feedsViewController;
@property (nonatomic, strong) FeedDetailViewController *feedDetailViewController;
@property (nonatomic, strong) DashboardViewController *dashboardViewController;
@property (nonatomic, strong) StoryDetailViewController *storyDetailViewController;
@property (nonatomic, strong) ShareViewController *shareViewController;
@property (readwrite) BOOL feedDetailIsVisible;
@end
@implementation NBContainerViewController
@synthesize appDelegate;
@synthesize masterNavigationController;
@synthesize feedsViewController;
@synthesize feedDetailViewController;
@synthesize dashboardViewController;
@synthesize storyDetailViewController;
@synthesize shareViewController;
@synthesize feedDetailIsVisible;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor blackColor];
self.masterNavigationController = appDelegate.navigationController;
self.feedsViewController = appDelegate.feedsViewController;
self.dashboardViewController = appDelegate.dashboardViewController;
self.feedDetailViewController = appDelegate.feedDetailViewController;
self.storyDetailViewController = appDelegate.storyDetailViewController;
// adding dashboardViewController
[self addChildViewController:self.dashboardViewController];
[self.view addSubview:self.dashboardViewController.view];
[self.dashboardViewController didMoveToParentViewController:self];
// adding master navigation controller
[self addChildViewController:self.masterNavigationController];
[self.view addSubview:self.masterNavigationController.view];
[self.masterNavigationController didMoveToParentViewController:self];
2012-07-24 16:03:16 -07:00
// set default x coordinate for feedDetailY from saved preferences
// NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults];
// NSInteger savedFeedDetailPortraitYCoordinate = [userPreferences integerForKey:@"feedDetailPortraitYCoordinate"];
// if (savedFeedDetailPortraitYCoordinate) {
// self.feedDetailPortraitYCoordinate = savedFeedDetailPortraitYCoordinate;
// } else {
// self.feedDetailPortraitYCoordinate = 960;
// }
}
- (void)viewWillLayoutSubviews {
[self adjustDashboardScreen];
}
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
if (!self.feedDetailIsVisible) {
[self adjustDashboardScreen];
} else {
[self adjustFeedDetailScreen];
}
}
# pragma mark Screen Transitions and Layout
- (void)adjustDashboardScreen {
CGRect vb = [self.view bounds];
self.masterNavigationController.view.frame = CGRectMake(0, 0, NB_DEFAULT_MASTER_WIDTH, vb.size.height);
self.dashboardViewController.view.frame = CGRectMake(NB_DEFAULT_MASTER_WIDTH + 1, 0, vb.size.width - NB_DEFAULT_MASTER_WIDTH - 1, vb.size.height);
}
- (void)adjustFeedDetailScreen {
CGRect vb = [self.view bounds];
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if (UIInterfaceOrientationIsPortrait(orientation)) {
if ([[self.masterNavigationController viewControllers] containsObject:self.feedDetailViewController]) {
[self.masterNavigationController popViewControllerAnimated:NO];
}
self.storyDetailViewController.view.frame = CGRectMake(0, 0, vb.size.width, vb.size.height - NB_DEFAULT_STORY_TITLE_HEIGHT);
self.feedDetailViewController.view.frame = CGRectMake(0, vb.size.height - NB_DEFAULT_STORY_TITLE_HEIGHT, vb.size.width, NB_DEFAULT_STORY_TITLE_HEIGHT);
[self.view addSubview:self.feedDetailViewController.view];
[self.masterNavigationController.view removeFromSuperview];
} else {
if (![[self.masterNavigationController viewControllers] containsObject:self.feedDetailViewController]) {
[self.masterNavigationController pushViewController:self.feedDetailViewController animated:NO];
}
[self.view addSubview:self.masterNavigationController.view];
self.masterNavigationController.view.frame = CGRectMake(0, 0, NB_DEFAULT_MASTER_WIDTH, vb.size.height);
self.storyDetailViewController.view.frame = CGRectMake(NB_DEFAULT_MASTER_WIDTH + 1, 0, vb.size.width - NB_DEFAULT_MASTER_WIDTH - 1, vb.size.height);
}
}
- (void)transitionToFeedDetail {
self.feedDetailIsVisible = YES;
CGRect vb = [self.view bounds];
// adding feedDetailViewController
[self addChildViewController:self.feedDetailViewController];
[self.view addSubview:self.feedDetailViewController.view];
[self.feedDetailViewController didMoveToParentViewController:self];
// adding storyDetailViewController
[self addChildViewController:self.storyDetailViewController];
[self.view addSubview:self.storyDetailViewController.view];
[self.storyDetailViewController didMoveToParentViewController:self];
self.storyDetailViewController.webView.hidden = YES;
self.storyDetailViewController.bottomPlaceholderToolbar.hidden = NO;
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if (UIInterfaceOrientationIsPortrait(orientation)) {
self.storyDetailViewController.view.frame = CGRectMake(vb.size.width, 0, vb.size.width, vb.size.height - NB_DEFAULT_STORY_TITLE_HEIGHT);
self.feedDetailViewController.view.frame = CGRectMake(vb.size.width, vb.size.height - NB_DEFAULT_STORY_TITLE_HEIGHT, vb.size.width, NB_DEFAULT_STORY_TITLE_HEIGHT);
float largeTimeInterval = NB_DEFAULT_SLIDER_INTERVAL * ( vb.size.width - NB_DEFAULT_MASTER_WIDTH) / vb.size.width;
float smallTimeInterval = NB_DEFAULT_SLIDER_INTERVAL * NB_DEFAULT_MASTER_WIDTH / vb.size.width;
[UIView animateWithDuration:largeTimeInterval delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
self.storyDetailViewController.view.frame = CGRectMake(NB_DEFAULT_MASTER_WIDTH + 1, 0, vb.size.width, vb.size.height - NB_DEFAULT_STORY_TITLE_HEIGHT);
self.feedDetailViewController.view.frame = CGRectMake(NB_DEFAULT_MASTER_WIDTH + 1, vb.size.height - NB_DEFAULT_STORY_TITLE_HEIGHT, vb.size.width, NB_DEFAULT_STORY_TITLE_HEIGHT);
} completion:^(BOOL finished) {
[UIView animateWithDuration:smallTimeInterval delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
self.storyDetailViewController.view.frame = CGRectMake(0, 0, vb.size.width, vb.size.height - NB_DEFAULT_STORY_TITLE_HEIGHT);
self.feedDetailViewController.view.frame = CGRectMake(0, vb.size.height - NB_DEFAULT_STORY_TITLE_HEIGHT, vb.size.width, NB_DEFAULT_STORY_TITLE_HEIGHT);
self.masterNavigationController.view.frame = CGRectMake( -NB_DEFAULT_MASTER_WIDTH, 0, NB_DEFAULT_MASTER_WIDTH, vb.size.height);
} completion:^(BOOL finished) {
[self.dashboardViewController.view removeFromSuperview];
[self.masterNavigationController.view removeFromSuperview];
}];
}];
} else {
[self.masterNavigationController pushViewController:self.feedDetailViewController animated:YES];
self.storyDetailViewController.view.frame = CGRectMake(NB_DEFAULT_MASTER_WIDTH + 1, 0, vb.size.width - NB_DEFAULT_MASTER_WIDTH - 1, vb.size.height);
[self.dashboardViewController.view removeFromSuperview];
}
}
- (void)transitionFromFeedDetail {
self.feedDetailIsVisible = NO;
CGRect vb = [self.view bounds];
// adding dashboardViewController and masterNavigationController
[self.view insertSubview:self.dashboardViewController.view atIndex:0];
[self.view addSubview:self.masterNavigationController.view];
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if (UIInterfaceOrientationIsPortrait(orientation)) {
self.dashboardViewController.view.frame = CGRectMake(NB_DEFAULT_MASTER_WIDTH + 1, 0, vb.size.width - NB_DEFAULT_MASTER_WIDTH - 1, vb.size.height);
self.masterNavigationController.view.frame = CGRectMake(-NB_DEFAULT_MASTER_WIDTH, 0, NB_DEFAULT_MASTER_WIDTH, vb.size.height);
float largeTimeInterval = NB_DEFAULT_SLIDER_INTERVAL * ( vb.size.width - NB_DEFAULT_MASTER_WIDTH) / vb.size.width;
float smallTimeInterval = NB_DEFAULT_SLIDER_INTERVAL * NB_DEFAULT_MASTER_WIDTH / vb.size.width;
[UIView animateWithDuration:largeTimeInterval delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
self.masterNavigationController.view.frame = CGRectMake(0, 0, NB_DEFAULT_MASTER_WIDTH, vb.size.height);
self.storyDetailViewController.view.frame = CGRectMake(NB_DEFAULT_MASTER_WIDTH, 0, vb.size.width, vb.size.height - NB_DEFAULT_STORY_TITLE_HEIGHT);
self.feedDetailViewController.view.frame = CGRectMake(NB_DEFAULT_MASTER_WIDTH, vb.size.height - NB_DEFAULT_STORY_TITLE_HEIGHT, vb.size.width, NB_DEFAULT_STORY_TITLE_HEIGHT);
} completion:^(BOOL finished) {
[UIView animateWithDuration:smallTimeInterval delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
self.storyDetailViewController.view.frame = CGRectMake(vb.size.width, 0, vb.size.width, vb.size.height - NB_DEFAULT_STORY_TITLE_HEIGHT);
self.feedDetailViewController.view.frame = CGRectMake(vb.size.width, vb.size.height - NB_DEFAULT_STORY_TITLE_HEIGHT, vb.size.width, NB_DEFAULT_STORY_TITLE_HEIGHT);
} completion:^(BOOL finished) {
[self.storyDetailViewController.view removeFromSuperview];
[self.feedDetailViewController.view removeFromSuperview];
}];
}];
} else {
// [self.masterNavigationController pushViewController:self.feedDetailViewController animated:YES];
// self.storyDetailViewController.view.frame = CGRectMake(NB_DEFAULT_MASTER_WIDTH + 1, 0, vb.size.width - NB_DEFAULT_MASTER_WIDTH - 1, vb.size.height);
// [self.dashboardViewController.view removeFromSuperview];
}
}
@end