【发布时间】: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 屏幕冻结。
【问题讨论】:
标签: ios swift ipad uisplitviewcontroller