ios - 显示/隐藏 UISplitViewController 的主视图 Controller 移动详细 View

标签 ios swift autolayout uisplitviewcontroller

我有一个 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 的主视图之前的屏幕截图。 Before

这是从图形 View 返回后的结果。 After

我试图解决这个问题是强制详细 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/

相关文章:

iOS 8 TableView Controller 性能问题

swift - 带有内部阴影的自定义圆形文本字段未获得正确的布局

swift - 按数字范围过滤数组

ios - UIView 的程序化 "fuzzy"样式背景

iOS 更新 TableViewCell 约束

iOS TableView 和 prototypecell 约束无法正常工作

javascript - Phonegap - 使用 window.location.replace 离开索引范围后处理推送通知

ios-charts 缺少 PieChart 的标签(图例)

ios - UITableView 单元格中的标签在滚动开始之前不会换行

ios - 如何从相机胶卷中删除照片?