我在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的主视图之前的屏幕截图。
我尝试解决此问题的方法是强制详细视图自行布局。 我尝试了以下操作:
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()
}
它有点奏效,但会导致界面出现丑陋的跳跃,因为详细视图会先出现,然后一秒钟后重新布局。有没有更好的方法在显示视图之前使其正确地布局?
setNeedsLayout
。尝试将super.viewWillLayoutSubviews()
放在覆盖块的末尾。 - Tim