我有一个 UISplitViewController,用于 iPad 上的主/细节功能。主视图 Controller 显示项目列表,当用户选择一个项目时,详细信息显示在详细 View Controller 中。我将详细 View Controller 设置为导航到另一个 View Controller 以显示图形。发生这种情况时,我会在 prepareForSeque 中使用以下行隐藏主视图 Controller 。
if let svc = self.splitViewController {
svc.preferredDisplayMode = .PrimaryHidden
}
这很好用。从图形 View 导航回详细 View 时,我想再次显示 Split View Controller 的主视图。我把它放在 viewWillAppear 中。
guard let svc = self.splitViewController else { return }
if svc.preferredDisplayMode != .Automatic {
svc.preferredDisplayMode = .Automatic
}
再次,这完全符合我的预期。问题是详细 View 在此过程中更改了大小,并且从图形 View 返回时布局不正确。
这是导航到图形 View 之前以及隐藏 UISplitViewController 的主视图之前的屏幕截图。
我试图解决这个问题是强制详细 View 自行布局。我尝试了以下方法:
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()
}
它有点工作,但会导致界面出现丑陋的跳转,因为详细 View 出现,然后在一秒钟后重新布局。有没有更好的方法在显示之前正确布局 View ?
最佳答案
我让它工作了,我想我会分享以防其他人遇到同样的问题。正如蒂姆在评论中所说,这是一个在链中尽早运行布局的问题,以便在 View 显示在屏幕上之前完成布局。
我在图形 View Controller 场景中执行了以下操作:
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
guard let svc = self.splitViewController else { return }
svc.preferredDisplayMode = .Automatic
}
这会将 Split View重新设置为在过程的早期同时显示主视图 Controller 和辅助 View Controller 。
我出错的地方是我的详细 View Controller 的父级是 UINavigationController。我假设因为它的大小错误,我需要在设置 Split View Controller 以显示主视图和次 View 后让它重新布局。这是一个错误的假设。最终起作用的是更上一层楼到 UISplitviewController 并让它自己执行布局。
在我的详细 View Controller 中,我执行了以下操作:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
guard let svc = self.splitViewController else { return }
svc.view.setNeedsLayout()
svc.view.layoutIfNeeded()
}
这在链中足够早,所有布局在 View 显示之前完成,但足够晚, Split View Controller 具有适当的大小信息来显示主视图和辅助 View 。
希望这对其他人有帮助,并感谢您的评论。
关于ios - 显示/隐藏 UISplitViewController 的主视图 Controller 移动详细 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33748363/