From 2b3d331fa99ae8f463456b3ba25ac680cc5c9e5a Mon Sep 17 00:00:00 2001 From: David Sinclair Date: Sat, 16 Jan 2021 20:47:03 -0800 Subject: [PATCH] #817 (three column layout) - When rotating iPhone from portrait to landscape, the feed detail now appears correctly. - Eliminated some popping; changing columns works differently with the split view. --- .../ios/Classes/DetailObjCViewController.m | 36 ++++++++++--------- .../Classes/FeedDetailObjCViewController.m | 29 ++++++++------- clients/ios/Classes/FeedsObjCViewController.m | 3 +- clients/ios/Classes/NewsBlurAppDelegate.m | 33 ++++++++++------- clients/ios/Classes/SplitViewDelegate.swift | 8 +++++ 5 files changed, 68 insertions(+), 41 deletions(-) diff --git a/clients/ios/Classes/DetailObjCViewController.m b/clients/ios/Classes/DetailObjCViewController.m index bfdb8a5270..8bc27bc632 100644 --- a/clients/ios/Classes/DetailObjCViewController.m +++ b/clients/ios/Classes/DetailObjCViewController.m @@ -419,10 +419,11 @@ - (BOOL)becomeFirstResponder { - (void)transitionFromFeedDetail { if (appDelegate.detailViewController.storyTitlesOnLeft) { - [appDelegate.feedsNavigationController - popToViewController:[appDelegate.feedsNavigationController.viewControllers - objectAtIndex:0] - animated:YES]; +// [appDelegate.feedsNavigationController +// popToViewController:[appDelegate.feedsNavigationController.viewControllers +// objectAtIndex:0] +// animated:YES]; + [self.splitViewController showColumn:UISplitViewControllerColumnSupplementary]; [appDelegate hideStoryDetailView]; } else { [appDelegate.masterContainerViewController transitionFromFeedDetail]; @@ -950,10 +951,11 @@ - (void)applyNewIndex:(NSInteger)newIndex }]; } else if (!appDelegate.feedDetailViewController.pageFinished && !appDelegate.feedDetailViewController.pageFetching) { - [appDelegate.feedsNavigationController - popToViewController:[appDelegate.feedsNavigationController.viewControllers - objectAtIndex:0] - animated:YES]; +// [appDelegate.feedsNavigationController +// popToViewController:[appDelegate.feedsNavigationController.viewControllers +// objectAtIndex:0] +// animated:YES]; + [self.splitViewController showColumn:UISplitViewControllerColumnSupplementary]; [appDelegate hideStoryDetailView]; } } else if (!outOfBounds) { @@ -1827,10 +1829,11 @@ - (IBAction)doNextUnreadStory:(id)sender { self.waitingForNextUnreadFromServer = YES; [fdvc fetchNextPage:nil]; } else if (nextLocation == -1) { - [appDelegate.feedsNavigationController - popToViewController:[appDelegate.feedsNavigationController.viewControllers - objectAtIndex:0] - animated:YES]; +// [appDelegate.feedsNavigationController +// popToViewController:[appDelegate.feedsNavigationController.viewControllers +// objectAtIndex:0] +// animated:YES]; + [self.splitViewController showColumn:UISplitViewControllerColumnSupplementary]; [appDelegate hideStoryDetailView]; } else { [self changePage:nextLocation]; @@ -1843,10 +1846,11 @@ - (IBAction)doPreviousStory:(id)sender { self.circularProgressView.hidden = NO; id previousStoryId = [appDelegate.storiesCollection popReadStory]; if (!previousStoryId || previousStoryId == [appDelegate.activeStory objectForKey:@"story_hash"]) { - [appDelegate.feedsNavigationController - popToViewController:[appDelegate.feedsNavigationController.viewControllers - objectAtIndex:0] - animated:YES]; +// [appDelegate.feedsNavigationController +// popToViewController:[appDelegate.feedsNavigationController.viewControllers +// objectAtIndex:0] +// animated:YES]; + [self.splitViewController showColumn:UISplitViewControllerColumnSupplementary]; [appDelegate hideStoryDetailView]; } else { NSInteger previousLocation = [appDelegate.storiesCollection locationOfStoryId:previousStoryId]; diff --git a/clients/ios/Classes/FeedDetailObjCViewController.m b/clients/ios/Classes/FeedDetailObjCViewController.m index db5131f341..4f20d46c79 100644 --- a/clients/ios/Classes/FeedDetailObjCViewController.m +++ b/clients/ios/Classes/FeedDetailObjCViewController.m @@ -2084,10 +2084,12 @@ - (IBAction)doOpenMarkReadMenu:(id)sender { void (^pop)(void) = ^{ if (!self.isPhoneOrCompact) { - [self.appDelegate.feedsNavigationController popToRootViewControllerAnimated:YES]; +// [self.appDelegate.feedsNavigationController popToRootViewControllerAnimated:YES]; + [self.splitViewController showColumn:UISplitViewControllerColumnPrimary]; [self.appDelegate.masterContainerViewController transitionFromFeedDetail]; } else { - [self.appDelegate.feedsNavigationController popToViewController:[self.appDelegate.feedsNavigationController.viewControllers objectAtIndex:0] animated:YES]; +// [self.appDelegate.feedsNavigationController popToViewController:[self.appDelegate.feedsNavigationController.viewControllers objectAtIndex:0] animated:YES]; + [self.splitViewController showColumn:UISplitViewControllerColumnPrimary]; } }; @@ -2443,10 +2445,11 @@ - (void)deleteSite { [self.appDelegate POST:urlString parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { [self.appDelegate reloadFeedsView:YES]; - [self.appDelegate.feedsNavigationController - popToViewController:[self.appDelegate.feedsNavigationController.viewControllers - objectAtIndex:0] - animated:YES]; +// [self.appDelegate.feedsNavigationController +// popToViewController:[self.appDelegate.feedsNavigationController.viewControllers +// objectAtIndex:0] +// animated:YES]; + [self.splitViewController showColumn:UISplitViewControllerColumnPrimary]; [MBProgressHUD hideHUDForView:self.view animated:YES]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { [self requestFailed:error]; @@ -2469,10 +2472,11 @@ - (void)deleteFolder { [appDelegate POST:urlString parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { [self.appDelegate reloadFeedsView:YES]; - [self.appDelegate.feedsNavigationController - popToViewController:[self.appDelegate.feedsNavigationController.viewControllers - objectAtIndex:0] - animated:YES]; +// [self.appDelegate.feedsNavigationController +// popToViewController:[self.appDelegate.feedsNavigationController.viewControllers +// objectAtIndex:0] +// animated:YES]; + [self.splitViewController showColumn:UISplitViewControllerColumnPrimary]; [MBProgressHUD hideHUDForView:self.view animated:YES]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { [self requestFailed:error]; @@ -2498,8 +2502,9 @@ - (void)muteSite { [params setObject:activeIdentifiers forKey:@"approved_feeds"]; [appDelegate POST:urlString parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { [self.appDelegate reloadFeedsView:YES]; - [self.appDelegate.feedsNavigationController popToViewController:[self.appDelegate.feedsNavigationController.viewControllers objectAtIndex:0] - animated:YES]; +// [self.appDelegate.feedsNavigationController popToViewController:[self.appDelegate.feedsNavigationController.viewControllers objectAtIndex:0] +// animated:YES]; + [self.splitViewController showColumn:UISplitViewControllerColumnPrimary]; [MBProgressHUD hideHUDForView:self.view animated:YES]; } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { [self requestFailed:error]; diff --git a/clients/ios/Classes/FeedsObjCViewController.m b/clients/ios/Classes/FeedsObjCViewController.m index 27a84342f8..9a76a08649 100644 --- a/clients/ios/Classes/FeedsObjCViewController.m +++ b/clients/ios/Classes/FeedsObjCViewController.m @@ -920,7 +920,8 @@ - (void)showUserProfile { } - (IBAction)tapAddSite:(id)sender { - [self.appDelegate.addSiteNavigationController popToRootViewControllerAnimated:NO]; +// [self.appDelegate.addSiteNavigationController popToRootViewControllerAnimated:NO]; + [self.splitViewController showColumn:UISplitViewControllerColumnPrimary]; [self.appDelegate showPopoverWithViewController:self.appDelegate.addSiteNavigationController contentSize:CGSizeMake(320, 96) barButtonItem:self.addBarButton]; diff --git a/clients/ios/Classes/NewsBlurAppDelegate.m b/clients/ios/Classes/NewsBlurAppDelegate.m index fe74bfb5e2..013c074af8 100644 --- a/clients/ios/Classes/NewsBlurAppDelegate.m +++ b/clients/ios/Classes/NewsBlurAppDelegate.m @@ -1564,7 +1564,8 @@ - (void)loadFeed:(NSString *)feedId if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { [self loadFeedDetailView]; } else if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { - [self.feedsNavigationController popToRootViewControllerAnimated:NO]; +// [self.feedsNavigationController popToRootViewControllerAnimated:NO]; + [self.splitViewController showColumn:UISplitViewControllerColumnPrimary]; [self hidePopoverAnimated:NO completion:^{ if (self.feedsNavigationController.presentedViewController) { [self.feedsNavigationController dismissViewControllerAnimated:NO completion:^{ @@ -1609,7 +1610,8 @@ - (void)loadTryFeedDetailView:(NSString *)feedId if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { [self loadFeedDetailView]; } else if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { - [self.feedsNavigationController popToRootViewControllerAnimated:NO]; +// [self.feedsNavigationController popToRootViewControllerAnimated:NO]; + [self.splitViewController showColumn:UISplitViewControllerColumnPrimary]; [self hidePopoverAnimated:YES completion:^{ if (self.feedsNavigationController.presentedViewController) { [self.feedsNavigationController dismissViewControllerAnimated:YES completion:^{ @@ -1625,7 +1627,8 @@ - (void)loadTryFeedDetailView:(NSString *)feedId - (void)loadStarredDetailViewWithStory:(NSString *)contentId showFindingStory:(BOOL)showHUD { if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { - [self.feedsNavigationController popToRootViewControllerAnimated:NO]; +// [self.feedsNavigationController popToRootViewControllerAnimated:NO]; + [self.splitViewController showColumn:UISplitViewControllerColumnPrimary]; [self.feedsNavigationController dismissViewControllerAnimated:YES completion:nil]; [self hidePopoverAnimated:NO]; } @@ -1879,6 +1882,7 @@ - (void)loadRiverFeedDetailView:(FeedDetailViewController *)feedDetailView withF } [navController showViewController:feedDetailViewController sender:self]; + [self.splitViewController showColumn:UISplitViewControllerColumnSupplementary]; } if (!transferFromDashboard) { @@ -1897,7 +1901,8 @@ - (void)loadRiverFeedDetailView:(FeedDetailViewController *)feedDetailView withF - (void)openDashboardRiverForStory:(NSString *)contentId showFindingStory:(BOOL)showHUD { if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { - [self.feedsNavigationController popToRootViewControllerAnimated:NO]; +// [self.feedsNavigationController popToRootViewControllerAnimated:NO]; + [self.splitViewController showColumn:UISplitViewControllerColumnPrimary]; [self.feedsNavigationController dismissViewControllerAnimated:YES completion:nil]; [self hidePopoverAnimated:NO]; } @@ -2228,11 +2233,12 @@ - (void)closeOriginalStory { } - (void)hideStoryDetailView { - if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { - [self.masterContainerViewController transitionFromFeedDetail]; - } else { - [self.feedsNavigationController popViewControllerAnimated:YES]; - } + [self.splitViewController showColumn:UISplitViewControllerColumnSupplementary]; +// if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { +// [self.masterContainerViewController transitionFromFeedDetail]; +// } else { +// [self.feedsNavigationController popViewControllerAnimated:YES]; +// } } #pragma mark - @@ -2240,18 +2246,21 @@ - (void)hideStoryDetailView { - (void)handleUserActivity:(NSUserActivity *)activity { if ([activity.activityType isEqualToString:@"com.newsblur.refresh"]) { - [self.feedsNavigationController popToRootViewControllerAnimated:NO]; +// [self.feedsNavigationController popToRootViewControllerAnimated:NO]; + [self.splitViewController showColumn:UISplitViewControllerColumnPrimary]; [self.feedsViewController refreshFeedList]; } else if ([activity.activityType isEqualToString:@"com.newsblur.gotoFolder"]) { NSString *folder = activity.userInfo[@"folder"]; - [self.feedsNavigationController popToRootViewControllerAnimated:NO]; +// [self.feedsNavigationController popToRootViewControllerAnimated:NO]; + [self.splitViewController showColumn:UISplitViewControllerColumnPrimary]; [self loadRiverFeedDetailView:self.feedDetailViewController withFolder:folder]; } else if ([activity.activityType isEqualToString:@"com.newsblur.gotoFeed"]) { NSString *folder = activity.userInfo[@"folder"]; NSString *feedID = activity.userInfo[@"feedID"]; - [self.feedsNavigationController popToRootViewControllerAnimated:NO]; +// [self.feedsNavigationController popToRootViewControllerAnimated:NO]; + [self.splitViewController showColumn:UISplitViewControllerColumnPrimary]; [self loadFolder:folder feedID:feedID]; } } diff --git a/clients/ios/Classes/SplitViewDelegate.swift b/clients/ios/Classes/SplitViewDelegate.swift index ade4032f5f..6883c4e9ec 100644 --- a/clients/ios/Classes/SplitViewDelegate.swift +++ b/clients/ios/Classes/SplitViewDelegate.swift @@ -16,6 +16,14 @@ class SplitViewDelegate: NSObject, UISplitViewControllerDelegate { } func splitViewController(_ svc: UISplitViewController, displayModeForExpandingToProposedDisplayMode proposedDisplayMode: UISplitViewController.DisplayMode) -> UISplitViewController.DisplayMode { + if let supplementaryNav = svc.viewController(for: .supplementary) as? UINavigationController, + supplementaryNav.viewControllers.isEmpty, + let primaryNav = svc.viewController(for: .primary) as? UINavigationController, + primaryNav.viewControllers.count > 1, + let feedDetail = primaryNav.viewControllers[1] as? FeedDetailViewController { + supplementaryNav.viewControllers = [feedDetail] + } + if UIDevice.current.userInterfaceIdiom == .phone, proposedDisplayMode == .twoOverSecondary { return .oneOverSecondary } else {