繁体   English   中英

更新UISplitViewController子类中的DetailViewController框架

[英]Update frame of DetailViewController in subclass of UISplitViewController

我希望在splitViewController?.displayMode == .PrimaryOverlay时更改DetailViewController的框架,以使DetailViewController视图不会被MasterViewController遮盖。 在iPad纵向方向上,使用自定义UISplitViewController和重写的viewDidLayoutSubviews方法(如jrc的答案所述),从iPad纵向方向导航到splitViewController?.displayMode == .PrimaryHiddensplitViewController?.displayMode == .PrimaryOverlay splitViewController?.displayMode == .PrimaryHidden时,我已经设法使此工作正常工作:如jrc的答案所述: 更改宽度UISplitViewController中的Master (请参见下文)。 我已经将情节提要中的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屏幕冻结。

对于想知道如何使主视图和局部视图控制器在iPad上不重叠的情况下并排显示的人来说,这真的很容易! 只需添加preferredDisplayMode = .AllVisible 无需使用自定义的SplitViewControllers(例如MGSplitViewController或更改Split View Controller的框架。 :-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM