检测主视图控制器和详细视图控制器是否同时显示在屏幕上?

16
我已经使用Xcode 6中的通用故事板(Universal Storyboard)实现了一个UISplitViewController。现在支持在运行iOS8的iPhone上使用UISplitViewController,默认情况下一次只有一个视图控制器在屏幕上。
我需要知道何时两个主视图和详情视图控制器都在屏幕上(iPad)。如果两者都在屏幕上,我需要从UITableViewCell中删除披露指示符 —— 只有在只有主视图控制器在屏幕上(iPhone)的情况下才呈现它们,就像“设置”应用程序一样。
我可以简单地检测设备并仅在iPhone上添加它们,但不建议这样做。可能会出现新设备只显示一个视图控制器而不识别为电话的情况。另一个想法是检测self.splitViewController是否为nil,但这种方法行不通,因为在iPhone和iPad上它实际上都是一个分割视图控制器,所以不会是nil是否可能检测出主视图和详情视图控制器同时可见的情况?
4个回答

24

UISplitViewController

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

当分屏视图控制器从水平规则转换为水平紧凑环境时,此属性设置为YES,表示分屏视图控制器内容在语义上已经折叠成单个容器。折叠后,分屏视图控制器报告其viewControllers属性中仅有一个子视图控制器。其他视图控制器将通过委托对象折叠到另一个视图控制器的内容中或者临时地被丢弃。折叠时,displayMode属性对分屏视图控制器界面的外观没有影响。

当分屏视图控制器能够同时显示其两个子视图控制器时,无论此刻是否正在显示它们两个,此属性的值均为NO。在这种展开模式下,分屏视图控制器的子视图控制器配置由displayMode属性确定,并且viewControllers属性包含主要和次要视图控制器。

在从展开到折叠接口的过渡期间,在折叠过渡完成并调用所有相关委托方法之前,此属性的值为NO。同样,在向展开接口进行过渡时,直到过渡完成为止,其值为YES。

来自类引用。

感谢Frederik A. Winkelsdorf:

需要注意的是,如果DetailViewController缩放以覆盖整个屏幕,则.collapsed也会返回false。如果您真的想知道两个视图控制器是否都可见,请检查splitViewController.displayMode == UISplitViewControllerDisplayMode.AllVisible属性,在处理iPhone 6 Plus横向布局时非常有用。


在使用iOS 9多任务分屏时,是否有可能重新在屏幕上绘制这些内容?当您从右侧引入应用程序时,它具有披露指示器。如果您将其拉伸以占据整个屏幕(不再是多任务处理),则披露指示器仍然存在。如何重新绘制这些单元格以不再具有它们? - Mario A Guzman
12
需要注意的是,如果DetailViewController被缩放以覆盖整个屏幕,则.collapsed也会报告为false。如果您真的想知道两者是否可见,请检查splitViewController.displayMode == UISplitViewControllerDisplayMode.AllVisible旁边的.collapsed属性。在处理iPhone 6 Plus横向布局时,我发现这非常有用。 - Frederik Winkelsdorf
我如何判断只有主视图可见?(iPhone) - user5306470

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");
  }
}

1

在Swift中:

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

if displayMode == .primaryHidden {
        print("Detail is visible")
    }
if displayMode == .allVisible {
        print("Master and Detail are visible")
    }
}

0

我发现使用显示模式对我没有用,但这些方法可以。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接