0

我想在我的应用程序的第一个 VC 之上以及它呈现的第二个 VC 之上显示一些 UI 元素,例如搜索栏。

我的解决方案是创建一个 ContainerViewController,它调用addChildViewController(firstViewController), 和view.addSubview(firstViewController.view). 然后view.addSubview(searchBarView),每个 UI 元素都类似。

稍后,FirstViewController 可能会调用present(secondViewController),理想情况下,它会向上滑动到屏幕上,而我的搜索栏和其他元素仍然出现在两个视图控制器的顶部。

相反,secondViewController它显示在 ContainerViewController 的顶部,从而隐藏了搜索栏。

我还希望,当用户点击搜索栏时,ContainerViewController 会在所有内容之上显示 SearchVC。为此,它很简单 - containerVC.present(searchVC)

我怎样才能让这个层次结构正常工作?

4

1 回答 1

0

如果我理解正确,您的问题是如何在子视图控制器的顶部(和边界内)呈现视图控制器,该子视图控制器的框架可能与父视图的边界不同。这可以通过设置modalPresentationStyle您想要呈现给的视图控制器的属性.overCurrentContext并将definesPresentationContext您的子视图控制器设置为true.

这是一个简单的示例,展示了它在实践中的工作方式:

override func viewDidLoad() {
    super.viewDidLoad()

    let childViewController = UIViewController()
    childViewController.view.backgroundColor = .yellow
    childViewController.view.translatesAutoresizingMaskIntoConstraints = true
    childViewController.view.frame = view.bounds.insetBy(dx: 60, dy: 60)
    view.addSubview(childViewController.view)
    addChildViewController(childViewController)
    childViewController.didMove(toParentViewController: self)

    // Wait a bit...
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) {
        let viewControllerToPresent = UIViewController()
        viewControllerToPresent.modalPresentationStyle = .overCurrentContext // sets to show itself over current context
        viewControllerToPresent.view.backgroundColor = .red

        childViewController.definesPresentationContext = true // defines itself as current context
        childViewController.present(viewControllerToPresent, animated: true, completion: nil)
    }
}
于 2017-10-23T22:35:14.447 回答