【问题标题】:Update frame of DetailViewController in subclass of UISplitViewController更新 UISplitViewController 子类中 DetailViewController 的框架
【发布时间】: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 屏幕冻结。

【问题讨论】:

    标签: ios swift ipad uisplitviewcontroller


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多