UIViewControllerContextTransitioning的containerView真的"the view that contains both views involved in t



我用一个带有"全屏幕"演示的segue模式演示VC,这意味着在转换后,两个视图都不会从层次结构中删除。让我们将控制器称为fromViewControllertoViewController

在我的animateTransition函数中,transitionContext.containerView()的描述是

充当过渡包含过渡

返回包含过渡

我决定测试这个:

当我使用自定义转换(只是内置的交叉渐变)并在运行时检查视图层次结构时,容器视图是UITransitionView的一个实例,不包含fromViewController,而是它的同级视图。在这种情况下,containerView的描述似乎并不准确,当然,内置的转换可能使用不同的逻辑。

当我使用自定义转换时,如果我只执行containerView?.addSubview(toViewController.view),则演示和解雇都有效。但一旦我也做了containerView?.addSubview(fromViewController.view)toViewController的解雇就会中断,我最终会得到一个空的UIWindow。

例如:

class MyAnimationController : NSObject, UIViewControllerAnimatedTransitioning 
{
    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
    guard let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey),
    let fromViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) else { return }
    let containerView = transitionContext.containerView()
    // containerView?.addSubview(fromViewController) // breaks dismissal
    containerView?.addSubview(toViewController)
    }
    // ...
}

我想知道"包含转换中涉及的两个视图的视图"在这里意味着什么?

这意味着它包含它们。但细节取决于演示风格,在任何情况下,这并不意味着你同时添加它们。"from"视图不能添加;实际上,它不是你的(因为在模态表示转换中,它不会移动)。添加它是运行时的工作。我的书详细解释了:

在呈现视图时,运行库必须做些什么才能使视图可自定义,这也更为复杂。没有可用作容器视图的现有视图;因此,当演示开始时,运行时必须构造容器视图,并将其插入接口中,并且只在视图保持呈现的时间内保留它。在.FullScreen演示的情况下,运行时还必须将演示视图从接口中取出并插入容器视图,因为您可能希望演示视图参与动画。对于其他样式的演示,容器视图位于演示视图的前面,演示视图不能设置动画,在演示过程中保持原位。

如果这是一个导航转换,那么仍然不会"添加"from view,因为它已经存在,但您可以将from view作为动画的一部分自由移动。

最新更新