iPhone 6 Plus 上的拆分视图控制器旋转

Split view controller rotation on iPhone 6 Plus

我有一个横向模式的拆分视图控制器,带有两个导航控制器。

这会折叠成纵向的单个导航控制器,并从主视图中推送详细视图控制器。

如果我在纵向推动详细视图控制器时旋转回横向,我不明白如何将详细视图控制器放回它自己的导航控制器中。

您应该实施 UISplitViewControllerDelegate。最简单的方法可能是拥有自己的 MySplitViewController class 并将其自身设置为 viewDidLoad:

中的委托
self.delegate = self;

首先,您可能希望 showDetailViewController 看起来像这样:

- (BOOL) splitViewController:(UISplitViewController*)splitViewController showDetailViewController:(UIViewController*)vc sender:(id)sender
{
    if (splitViewController.collapsed)
    {
        [(UINavigationController*)splitViewController.viewControllers[0]) pushViewController:vc animated:YES];
    }
    else
    {
        self.viewControllers = @[ self.viewControllers.firstObject, vc ];
    }
    return YES;
}

这应该能够在两个方向上正确显示细节视图。

接下来,您应该实现与此类似的以下委托方法:

    - (UIViewController*)                splitViewController:(UISplitViewController*)splitViewController
separateSecondaryViewControllerFromPrimaryViewController:(UIViewController*)primaryViewController
{
    UINavigationController* nc = primaryViewController;
    UIViewController* detailVC = nc.viewControllers.lastObject;
    return detailVC;
}

此方法是您从主控制器和 return 作为详细视图控制器获取所需内容的机会。上面的示例代码相当简单,您可能需要遍历导航 viewControllers 并从特定视图控制器开始选择所有内容(假设您从详细信息视图推送)。

无论如何,花点时间阅读一下真的会有收获:UISplitViewController class reference and especially UISplitViewControllerDelegate Protocol Reference 这样就会清楚很多。 如果您想要快捷方式,请查看 Xcode 拆分视图控制器模板项目。那一个还应该包含针对您的问题的提示或确切解决方案。

使细节有自己的导航控制器,就像在主细节模板中一样。当拆分视图折叠时,它会在主导航控制器上调用 showViewController,当它检测到 class UINavigationController 的控制器时,它会设置允许嵌套导航控制器为真并隐藏导航栏。这样你就可以保留详细导航,这样当你旋转到横向并分离它时可以再次使用现有导航。