是UIViewControllerContextTransition的容器视图真的"视图包含过渡中涉及的两个视图"?

时间:2015-11-04 03:10:37

标签: ios animation

我使用带有" over fullscreen"的模式呈现VC。表示,这意味着在转换后,视图都不会从层次结构中删除。我们致电控制器fromViewControllertoViewController

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

  

作为相关视图的超级视图的视图   过渡。包含两个视图的视图   过渡。

     

返回包含两个视图的视图   过渡

我决定测试一下:

当我使用我的自定义转换(仅内置交叉淡入淡出)并在运行时检查视图层次结构时,容器视图是UITransitionView的实例,不包含fromViewController - 而是它的兄弟。在这种情况下,containerView的描述看起来并不准确,当然内置转换可能使用不同的逻辑。

当我执行使用我的自定义转换时,如果我只执行containerView?.addSubview(toViewController.view),则演示和解雇都会有效。但是,一旦我containerView?.addSubview(fromViewController.view) toViewController被解雇,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) } // ... } 将会中断,我最终会得到一个空的UIWindow。

即。像这样的东西:

struct InData{
    int x,y,h,w;
    char* lbl;
};

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

1 个答案:

答案 0 :(得分:1)

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

  

在呈现视图以使演示文稿可自定义时,运行时必须执行的操作也更复杂。没有现有视图可用作容器视图;因此,当表示开始时,运行时必须构造容器视图并将其插入到界面中,并且只有在视图保持显示的情况下才将其保留在那里。在.FullScreen演示文稿的情况下,运行时还必须将呈现视图从界面中删除并将其插入到容器视图中,因为您可能希望呈现视图参与动画。对于其他呈现风格,容器视图位于呈现视图前面,无法进行动画处理,并在演示过程中保留原位。

如果这是一个导航转换,那么仍然不会添加"来自视图,因为它已经存在,但您可以自由地从视图中移动动画。