15

我已经UISplitViewController在 Xcode 6 中使用 Universal Storyboard实现了。UISplitViewController现在运行 iOS 8 的 iPhone 支持,默认情况下一次只有一个视图控制器出现在屏幕上。

我需要知道主视图控制器和详细视图控制器何时都在屏幕上(iPad)。如果两者都在屏幕上,我需要从UITableViewCells 中删除披露指示符 - 仅当只有主视图控制器在屏幕上(iPhone)时才渲染它们,就像设置应用程序一样。

我可以简单地检测设备并仅在它是 iPhone 时添加它们,但不建议这样做。新设备可能只显示一个视图控制器而不识别为电话。另一个想法是检测 if self.splitViewControlleris nil,但这不起作用,因为它不会nil在 iPhone 或 iPad 上,因为它实际上是在 iPhone 上的拆分视图控制器中。

是否可以检测到主视图控制器和详细视图控制器何时同时在屏幕上可见?

4

4 回答 4

24

UISplitViewController

@property(nonatomic, readonly, getter=isCollapsed) BOOL collapsed

当拆分视图控制器内容在语义上折叠到单个容器中时,此属性设置为 YES。当拆分视图控制器从水平规则转换到水平紧凑环境时,就会发生折叠。折叠后,拆分视图控制器报告其 viewControllers 属性中只有一个子视图控制器。另一个视图控制器在委托对象的帮助下折叠到另一个视图控制器的内容中或暂时丢弃。折叠时,displayMode 属性对拆分视图控制器界面的外观没有影响。

当拆分视图控制器能够同时显示其两个子视图控制器时,此属性的值为 NO,即使此时它没有同时显示它们。在此展开模式下,拆分视图控制器对其子视图控制器的配置由 displayMode 属性确定。此外,viewControllers 属性包含主视图控制器和辅助视图控制器。

在从展开界面到折叠界面的过渡期间,此属性的值为 NO,直到折叠过渡完成并且所有相关的委托方法都已被调用。类似地,当转换回扩展界面时,该值是 YES,直到转换完成。

从类参考。

感谢 Frederik A. Winkelsdorf:

应该注意的是,如果 a被缩放以覆盖整个屏幕,.collapsed也会报告错误 。DetailViewController如果您真的想知道两者是否可见,请查看.collapsed属性旁边的内容,splitViewController.displayMode == UISplitViewControllerDisplayMode.AllVisible.我发现它在处理 iPhone 6 Plus 横向布局时很有用。

于 2014-08-22T02:53:17.833 回答
3

这是检查 UISplitViewController 的 Displaymode 的方法

- (void)splitViewController:(UISplitViewController *)splitViewController willChangeToDisplayMode:(UISplitViewControllerDisplayMode)displayMode {
  if (displayMode == UISplitViewControllerDisplayModePrimaryHidden) {
       NSLog(@"Detail view is visible");
} else if (displayMode == UISplitViewControllerDisplayModeAllVisible) {
       NSLog(@"both are visible");
  }
}
于 2017-05-19T12:38:03.333 回答
1

迅速:

func splitViewController(_ svc: UISplitViewController, willChangeTo displayMode: UISplitViewController.DisplayMode) {

if displayMode == .primaryHidden {
        print("Detail is visible")
    }
if displayMode == .allVisible {
        print("Master and Detail are visible")
    }
}
于 2020-01-19T21:18:44.267 回答
0

我发现使用显示模式对我不起作用,但这些对我有用。

func primaryViewController(forExpanding splitViewController: UISplitViewController) -> UIViewController? {
    return nil
}

func primaryViewController(forCollapsing splitViewController: UISplitViewController) -> UIViewController? {
    return nil
}
于 2020-09-24T16:41:17.887 回答