在 UISplitViewController 的子类中更新 DetailViewController 的框架

Update frame of DetailViewController in subclass of UISplitViewController

我希望在 splitViewController?.displayMode == .PrimaryOverlay 时更改 DetailViewController 的框架,这样 DetailViewController 视图永远不会被 MasterViewController 遮挡。当我在 iPad 纵向方向从 splitViewController?.displayMode == .PrimaryHidden 导航到 splitViewController?.displayMode == .PrimaryOverlay 时,我已经设法让这个工作,使用自定义 UISplitViewController 和覆盖 viewDidLayoutSubviews 方法,如 jrc 的答案中所述:Change the width of Master in UISplitViewController(见下文)。我已将故事板中的 UISplitViewController 链接到 SplitViewController,并且 viewDidLayoutSubviews() 在初始应用程序加载时被调用 iPad。

SplitViewController.swift

override func viewDidLayoutSubviews() {

        var masterViewController = (self.viewControllers[0] as! UINavigationController).topViewController
        var detailViewController = (self.viewControllers[1] as! UINavigationController).topViewController

        // Adjust the width of the detail view
        var detailViewFrame = detailViewController!.view.frame
        detailViewFrame.origin.x += masterViewController!.view.frame.width
        detailViewFrame.size.width -= masterViewController!.view.frame.width
        detailViewController!.view.frame = detailViewFrame

        detailViewController!.view.setNeedsLayout()
    }

但是,当我在 splitViewController?.displayMode == .PrimaryOverlay,随后 select 来自 MasterViewController 的不同项目时,DetailViewController 框架恢复到默认框架大小和位置。我尝试使用以下方法解决此问题(尽管不建议以这种方式调用 viewDidLayoutSubviews()):

MasterViewController.swift

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        collapseDetailViewController = false
        splitViewController?.viewDidLayoutSubviews()
    }

现在,当我 select MasterViewController.swift splitViewController?.viewDidLayoutSubviews() 中的一个项目被调用时,但是在打印 DetailViewController 的 view.frame.origin.xview.frame.width 时我得到了奇怪的读数在 viewDidLayoutSubviews() 结束时。即使对框架进行了这些似乎已经发生的更改,DetailViewController 视图仍然被遮挡。

如果对如何修复 DetailViewController 框架有帮助,即使 select 在 MasterViewController 中添加新项目也不会被遮挡,我们将不胜感激。我没有运气实施任何 UISplitViewController 委托方法来解决这个问题,我还尝试在 didSelectRowAtIndexPath 末尾用 loadView 重新加载 SplitViewController 但这导致了冻结iPad 屏幕。

对于任何其他想知道如何让主视图控制器和详细视图控制器在进入 iPad 时并排显示而不重叠的人来说,这真的很简单!只需添加 preferredDisplayMode = .AllVisible。无需使用像 MGSplitViewController 这样的自定义 SplitViewControllers 或更改 Split View Controller 的框架。 :-)