更新 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.x
和 view.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