// // 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 960 - 591 #define NB_DEFAULT_SLIDER_INTERVAL 0.4 @interface NBContainerViewController () @property (nonatomic, strong) UINavigationController *masterNavigationController; @property (nonatomic, strong) UINavigationController *storyNavigationController; @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) int storyTitlesYCoordinate; @property (readwrite) BOOL feedDetailIsVisible; @end @implementation NBContainerViewController @synthesize appDelegate; @synthesize masterNavigationController; @synthesize feedsViewController; @synthesize feedDetailViewController; @synthesize dashboardViewController; @synthesize storyDetailViewController; @synthesize shareViewController; @synthesize feedDetailIsVisible; @synthesize storyNavigationController; @synthesize storyTitlesYCoordinate; - (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]; UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:self.storyDetailViewController]; self.storyNavigationController = nav; // set default y coordinate for feedDetailY from saved preferences NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults]; NSInteger savedStoryTitlesYCoordinate = [userPreferences integerForKey:@"storyTitlesYCoordinate"]; if (savedStoryTitlesYCoordinate) { self.storyTitlesYCoordinate = savedStoryTitlesYCoordinate; } else { self.storyTitlesYCoordinate = 960 - NB_DEFAULT_STORY_TITLE_HEIGHT; } } - (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)) { // add the back button //self.storyDetailViewController.topToolbar.items = [NSArray arrayWithObjects:self.storyDetailViewController.buttonBack, nil]; if ([[self.masterNavigationController viewControllers] containsObject:self.feedDetailViewController]) { [self.masterNavigationController popViewControllerAnimated:NO]; } self.storyNavigationController.view.frame = CGRectMake(0, 0, vb.size.width, self.storyTitlesYCoordinate); self.feedDetailViewController.view.frame = CGRectMake(0, self.storyTitlesYCoordinate, vb.size.width, vb.size.height - self.storyTitlesYCoordinate); [self.view addSubview:self.feedDetailViewController.view]; [self.masterNavigationController.view removeFromSuperview]; } else { // remove the back button //self.storyNavigationController.topToolbar.items = nil; 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.storyNavigationController.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.storyNavigationController]; [self.view addSubview:self.storyNavigationController.view]; [self.storyNavigationController didMoveToParentViewController:self]; // reset the storyDetailViewController components self.storyDetailViewController.webView.hidden = YES; self.storyDetailViewController.bottomPlaceholderToolbar.hidden = NO; self.storyDetailViewController.navigationItem.rightBarButtonItems = nil; int unreadCount = appDelegate.unreadCount; if (unreadCount == 0) { self.storyDetailViewController.progressView.progress = 1; } else { self.storyDetailViewController.progressView.progress = 0; } UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; if (UIInterfaceOrientationIsPortrait(orientation)) { self.storyNavigationController.view.frame = CGRectMake(vb.size.width, 0, vb.size.width, storyTitlesYCoordinate); self.feedDetailViewController.view.frame = CGRectMake(vb.size.width, self.storyTitlesYCoordinate, vb.size.width, vb.size.height - storyTitlesYCoordinate); 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.storyNavigationController.view.frame = CGRectMake(NB_DEFAULT_MASTER_WIDTH + 1, 0, vb.size.width, self.storyTitlesYCoordinate); self.feedDetailViewController.view.frame = CGRectMake(NB_DEFAULT_MASTER_WIDTH + 1, self.storyTitlesYCoordinate, vb.size.width, vb.size.height - storyTitlesYCoordinate); } completion:^(BOOL finished) { [UIView animateWithDuration:smallTimeInterval delay:0 options:UIViewAnimationOptionCurveLinear animations:^{ self.storyNavigationController.view.frame = CGRectMake(0, 0, vb.size.width, self.storyTitlesYCoordinate); self.feedDetailViewController.view.frame = CGRectMake(0, self.storyTitlesYCoordinate, vb.size.width, vb.size.height - storyTitlesYCoordinate); 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.storyNavigationController.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.storyNavigationController.view.frame = CGRectMake(NB_DEFAULT_MASTER_WIDTH, 0, vb.size.width, self.storyTitlesYCoordinate); self.feedDetailViewController.view.frame = CGRectMake(NB_DEFAULT_MASTER_WIDTH, self.storyTitlesYCoordinate, vb.size.width, vb.size.height - storyTitlesYCoordinate); } completion:^(BOOL finished) { [UIView animateWithDuration:smallTimeInterval delay:0 options:UIViewAnimationOptionCurveLinear animations:^{ self.storyNavigationController.view.frame = CGRectMake(vb.size.width, 0, vb.size.width, self.storyTitlesYCoordinate); self.feedDetailViewController.view.frame = CGRectMake(vb.size.width, self.storyTitlesYCoordinate, vb.size.width, vb.size.height - storyTitlesYCoordinate); } completion:^(BOOL finished) { [self.storyNavigationController.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]; } } - (void)dragStoryToolbar:(int)yCoordinate { // NSLog(@"yCoordinate is %i", yCoordinate); // account for top toolbar yCoordinate = yCoordinate + 44; if (yCoordinate > 344 && yCoordinate < 754) { // save coordinate self.storyTitlesYCoordinate = yCoordinate; NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults]; [userPreferences setInteger:yCoordinate forKey:@"storyTitlesYCoordinate"]; [userPreferences synchronize]; // change frames CGRect vb = [self.view bounds]; self.storyNavigationController.view.frame = CGRectMake(0, 0, vb.size.width, yCoordinate); self.feedDetailViewController.view.frame = CGRectMake(0, yCoordinate, vb.size.width, vb.size.height - yCoordinate); } } @end