更新 UISplitViewController 子类中 DetailViewController 的框架

Posted

技术标签:

【中文标题】更新 UISplitViewController 子类中 DetailViewController 的框架【英文标题】:Update frame of DetailViewController in subclass of UISplitViewController 【发布时间】:2016-06-30 14:05:38 【问题描述】:

我希望在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,并在 iPad 的初始应用加载时调用 viewDidLayoutSubviews()

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 中并随后从MasterViewController 中选择不同的项目时,DetailViewController 框架将恢复为默认的框架大小和位置。我尝试使用以下方法解决此问题(尽管不建议以这种方式调用 viewDidLayoutSubviews()):

MasterViewController.swift

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

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

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

【问题讨论】:

【参考方案1】:

对于任何想知道如何让主视图控制器和细节视图控制器在 iPad 上并排运行而不叠加的人来说,这真的很容易!只需添加preferredDisplayMode = .AllVisible。无需使用像MGSplitViewController 这样的自定义SplitViewController 或更改Split View Controller 的框架。 :-)

【讨论】:

以上是关于更新 UISplitViewController 子类中 DetailViewController 的框架的主要内容,如果未能解决你的问题,请参考以下文章

UISplitViewController 推送新的细节控制器,不更新侧面细节

UISplitViewController - 隐藏主滑入视图

在 UISplitViewController 中隐藏 MasterView

UISplitViewController - 双列样式不起作用

UISplitViewController 一致分隔符

UISplitViewController - 并排或纵向叠加