显示/隐藏UISplitViewController的主视图控制器会移动详细视图。

3

我在iPad上使用UISplitViewController实现主/从功能。主视图控制器显示一系列项目,当用户选择一个项目时,详细信息将显示在详细视图控制器中。我已经设置详细视图控制器导航到另一个视图控制器来显示图表。当发生这种情况时,我使用以下行在我的prepareForSegue中隐藏主视图控制器。

if let svc = self.splitViewController {
    svc.preferredDisplayMode = .PrimaryHidden
}

这很好用。当从图表视图返回到详细视图时,我希望再次显示分割视图控制器的主视图。我将此放在了viewWillAppear方法中。

guard let svc = self.splitViewController else { return }

if svc.preferredDisplayMode != .Automatic {
    svc.preferredDisplayMode = .Automatic
}

再次测试结果与我的预期完全一致。问题在于详细视图在此过程中会改变大小,并且在从图形视图返回时无法正确布局。

这是在导航到图形视图之前以及隐藏UISplitViewController的主视图之前的屏幕截图。 Before

这是从图形视图返回后的屏幕截图。 After

我尝试解决此问题的方法是强制详细视图自行布局。 我尝试了以下操作:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    guard let svc = self.splitViewController else { return }
    let detailNavController = svc.viewControllers[svc.viewControllers.count-1] as! UINavigationController
    detailNavController.view.setNeedsLayout()
}

它有点奏效,但会导致界面出现丑陋的跳跃,因为详细视图会先出现,然后一秒钟后重新布局。有没有更好的方法在显示视图之前使其正确地布局?


1
如果它能工作但是跳跃,你需要在链中更早地放置 setNeedsLayout。尝试将 super.viewWillLayoutSubviews() 放在覆盖块的末尾。 - Tim
不幸的是,这似乎没有改变任何事情。不过还是感谢您的建议。 - Mr Beardsley
你是否正在使用带有自动布局的故事板? - andrewbuilder
1个回答

4
我已经搞定了,并且想分享一下,以防其他人遇到同样的问题。正如Tim在评论中所述,它是一个问题,需要在链中尽早运行布局,以便在屏幕上呈现视图之前使它们布置好。
我在图形视图控制器场景中执行了以下操作:
override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    guard let svc = self.splitViewController else { return }
    svc.preferredDisplayMode = .Automatic
}

这将在过程的早期将分割视图设置为显示主要和次要视图控制器。
我犯错的地方是我的详细视图控制器的父级是UINavigationController。我假设由于这个大小被错误地设置,我需要在设置分割视图控制器以显示主要和次要视图之后让它重新布局。这是一个错误的假设。最终起作用的方法是再向上一级到UISplitviewController并让它对自身进行布局。
在我的详细视图控制器中,我执行了以下操作:
override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    guard let svc = self.splitViewController else { return }
    svc.view.setNeedsLayout()
    svc.view.layoutIfNeeded()
}

这在链条的早期完成了所有布局后,在显示视图之前,但足够晚以至于分割视图控制器具有适当的大小信息,可以显示主视图和辅助视图。

希望这能帮助其他人,感谢评论。


非常感谢。帮了很大的忙。 - DarkAgeOutlaw
1
谢谢,这对我很有帮助。特别是svc.view布局强制。当隐藏主控制器时,我的平板电脑上出现了奇怪的空白区域。 - Peterdk

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