如何设置过渡上下文以呈现视图控制器

时间:2019-05-20 22:43:46

标签: ios swift uiviewanimationtransition

我正在使用UIViewControllerTransitioningDelegate协议在两个视图控制器之间进行很好的转换,其中呈现的视图控制器嵌套在另一个视图控制器中。

现在的问题是,当呈现的视图控制器被关闭时,呈现的视图控制器没有被关闭。

所以我的视图控制器层次结构如下:

VC1具有一个属性,其中包含对VC2的引用。 VC2在某个时候会显示VC3,它实现了UIViewControllerTransitioningDelegate

VC2引用中有一个didSet

var vc2: VC2? {
    didSet {
        if let vc = vc2 {
            anotherController.addChild(vc)
            view.setSubview(vc.view, removeSubviews: false)
            vc.didMove(toParent: anotherController)
        } else if let dismissed = oldValue {
            dismissed.willMove(toParent: nil)
            view.subviews.forEach { $0.removeFromSuperview() }
            dismissed.removeFromParent()
        }
    }
}

如前所述,VC3正在实现UIViewControllerTransitioningDelegateUIViewControllerAnimatedTransitioning协议。我对func animateTransition(using transitionContext: UIViewControllerContextTransitioning)的实现如下所示:

guard let toVC = transitionContext.viewController(forKey: .to) else { return }

let containerView = transitionContext.containerView

if presenting {
    containerView.addSubview(toVC.view)

    // some animation
} else {
    // some reverse animation
}

VC2以非常标准的方式呼叫VC3

let vc = VC3()
self.present(vc, animated: true)

奇怪的是,在此方法中,transitionContext.viewController(forKey: .from)返回VC1而不是VC2,尽管VC2表示VC3,因此当{{ 1}}被关闭,VC2没有被删除。因此,VC3也将是containerView的视图,而不是VC1

在解除VC2的情况下,如何确保正确解除VC3的视图?

0 个答案:

没有答案