将子视图控制器添加到子视图,但在没有导航控制器的情况下使其成为整个视图的模态

时间:2018-12-27 18:10:33

标签: ios xcode uiviewcontroller childviewcontroller

使用Xcode 10 +,Swift 4,iOS 11.4 +

首先让我说我没有使用导航控制器- 我正在使用以下基本代码将ViewController作为孩子添加到另一个:

topController.addChildViewController(childVC)
topController.view.addSubview(childVC.view)
childVC.didMove(toParentViewController: topController)

孩子比父母小,并且有几个按钮,其中一个按钮会使其动画而不可见。

我不使用当前/关闭,因为它始终覆盖整个屏幕。

我希望它是模态的-一旦将其动画化为适当位置,屏幕上(在它后面)的其他任何东西都应该可用,直到将其动画化为看不见为止。

如何使childVC成为模态?

2 个答案:

答案 0 :(得分:0)

您可以尝试将控制器添加到具有windowLevel = UIWindowLevelAlert + 1的UIWindow中。然后,关闭动画完成后,您可以删除窗口。这是一个似乎有效的示例代码片段:

func presentChildVC() {
    modalWindow = UIWindow(frame: UIScreen.main.bounds)
    let rootController = UIViewController()
    rootController.view.backgroundColor = .clear
    rootController.addChild(childController)
    rootController.view.addSubview(childController.view)
    childController.didMove(toParent: rootController)

    modalWindow?.rootViewController = rootController
    modalWindow?.windowLevel = .alert + 1
    modalWindow?.makeKeyAndVisible()
    modalWindow?.backgroundColor = .clear
    UIView.animate(withDuration: 2, animations: {
        self.childController.view.alpha = 1
    })
}

func dismissChildVC() {
    UIView.animate(withDuration: 2, animations: {
        self.childController.view.alpha = 0
    }, completion: { _ in
        self.modalWindow?.isHidden = true
        self.modalWindow = nil
    })
}

答案 1 :(得分:0)

1)子项比父项小:-

您只需要像父视图一样更新子视图框架。

topController.addChildViewController(childVC)
topController.view.addSubview(childVC.view)
**childVC.view.frame.size.height = self.view.frame.size.height**
childVC.didMove(toParentViewController: topController)

2)有几个按钮,其中一个按钮会使其动画而不可见:-

在此类按钮上设置点击事件,以从父级删除子视图

self.willMove(toParentViewController: nil)
self.view.removeFromSuperview()
self.removeFromParentViewController()