检测主视图和详细视图控制器何时在屏幕上?

时间:2014-08-21 21:39:46

标签: ios uisplitviewcontroller uiaccessoryview

我在Xcode 6中使用通用故事板实现了UISplitViewController。现在运行iOS 8的iPhone支持UISplitViewController,默认情况下,一次只有一个视图控制器在屏幕上。< / p>

我需要知道主视图和详细视图控制器何时都在屏幕上(iPad)。我需要在屏幕上删除UITableViewCell s中的公开指示符 - 仅在屏幕上显示主视图控制器(iPhone)时才显示它们,就像设置应用程序一样。

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

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

4 个答案:

答案 0 :(得分:18)

UISplitViewController

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

  

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

     

拆分视图控制器时,此属性的值为NO   能够同时显示它的两个子视图控制器   时间,即使它现在没有显示它们。在这   扩展模式,拆分视图控制器的子配置   视图控制器由displayMode属性决定。在   另外,viewControllers属性包含primary和   二级视图控制器。

     

在从展开界面到折叠界面的过渡期间,值   在崩溃过渡完成之前,这个属性是NO   并调用了所有相关的委托方法。同样的,   转换回扩展界面时,值为YES   直到过渡结束。

来自班级参考。

感谢Frederik A. Winkelsdorf:

  

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

答案 1 :(得分:2)

这是检查Displaymode for UISplitViewController的方法

- (void)splitViewController:(UISplitViewController *)splitViewController willChangeToDisplayMode:(UISplitViewControllerDisplayMode)displayMode {
  if (displayMode == UISplitViewControllerDisplayModePrimaryHidden) {
       NSLog(@"Detail view is visible");
} else if (displayMode == UISplitViewControllerDisplayModeAllVisible) {
       NSLog(@"both are visible");
  }
}

答案 2 :(得分: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")
    }
}

答案 3 :(得分:0)

我发现使用显示模式对我来说不起作用,但确实如此。

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

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