UISplitViewController:使用UISplitViewControllerDisplayModeAllVisible在主视图中使用错误的顶部布局指南

时间:2016-03-03 17:59:36

标签: ios ipad uisplitviewcontroller

我有一个标准的分割视图控制器,我想在iPad上始终显示它的主视图。

在主视图viewDidLoad中,我正在致电:

self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible;

有了这一行,我就能得到我想要的效果(总是显示主人)。但是,也会发生一件奇怪的事情:顶部布局指南似乎移动到导航栏下主视图的顶部。

您可以在此图片中看到效果,其中表格视图中的第一个单元格部分隐藏在导航栏后面。事实上,它上面有一个绿色视图(它是一个很快就会存在的东西的占位符),这是完全隐藏的。

enter image description here

如果我将设备旋转为横向然后再回到纵向,则autolayout按预期工作,并且视图显示在正确的位置:

enter image description here

我已经在viewDidLoadviewDidAppear中尝试了以下操作,试图强制观点正确布局,但它没有效果:

[self.splitViewController.view setNeedsLayout];
[self.splitViewController.view layoutIfNeeded];

我正在寻找任何解决方案/建议。

4 个答案:

答案 0 :(得分:1)

我想以事后的观点回答我自己的问题。

Apple在其文档中提到:

  

在构建应用程序的用户界面时,拆分视图控制器通常是应用程序窗口的根视图控制器。

后来发出警告:

  

您无法将拆分视图控制器推送到导航堆栈。虽然可以在某些其他容器视图控制器中将拆分视图控制器安装为子级,但在大多数情况下不建议这样做。拆分视图控制器通常安装在应用程序窗口的根目录下。有关实现界面的方法的提示和指导,请参阅iOS人机界面指南。

尽管他们并非直截了当地说永远不会将UISplitViewController用作非根视图控制器,但我发现UISplitViewController在以非root方式使用时表现得不可靠。问题中提到的错误只是您将遇到的许多其他问题之一,其中较差的(根据我的经验)不会将-viewWillAppear-viewDidAppear调用传播给子视图控制器。

如果你想要一个非根分割视图,我建议你自己定制分割视图。

答案 1 :(得分:0)

唯一对我有用的是:

https://stackoverflow.com/a/22084634/1919412

在我的情况下,问题仅在用户第一次从横向模式旋转到纵向模式时显示(并且不首先手动显示主窗格)。因此,即使Rivera的解决方法导致了一个不和谐的视觉效果,每次发布时最多只能发生一次。

答案 2 :(得分:0)

我最近遇到了同样的问题并通过在启动时设置func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { ... if let splitController = self.window?.rootViewController as? UISplitViewController { splitController.preferredDisplayMode = .allVisible } ... return true } 来解决它:

$('a').click(function() {
  $('ul li a').removeClass();
  var index = $(this).parent().index();
  $('ul').each(function() {
    $('li', this).eq(index).find('a').addClass('clicked')
  })
})

答案 3 :(得分:0)

好:

我遇到了同样的问题(我猜)。 但如果我打电话:

.preferredDisplayMode=UISplitViewControllerDisplayModePrimaryOverlay

它就像一个魅力。