我使用带有" over fullscreen"的模式呈现VC。表示,这意味着在转换后,视图都不会从层次结构中删除。我们致电控制器fromViewController
和toViewController
。
在我的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;
};
我想知道什么"包含转换所涉及的两种观点的视图"在这里意味着什么?
答案 0 :(得分:1)
这意味着它包含它们。但细节取决于演示风格,在任何情况下,它并不意味着你添加它们的两个。 "来自"视图不是你要添加的;它实际上不是你的(因为在模态演示过渡中,它不会移动)。添加它是运行时的工作。我的书详细解释了:
在呈现视图以使演示文稿可自定义时,运行时必须执行的操作也更复杂。没有现有视图可用作容器视图;因此,当表示开始时,运行时必须构造容器视图并将其插入到界面中,并且只有在视图保持显示的情况下才将其保留在那里。在
.FullScreen
演示文稿的情况下,运行时还必须将呈现视图从界面中删除并将其插入到容器视图中,因为您可能希望呈现视图参与动画。对于其他呈现风格,容器视图位于呈现视图前面,无法进行动画处理,并在演示过程中保留原位。
如果这是一个导航转换,那么仍然不会添加"来自视图,因为它已经存在,但您可以自由地从视图中移动动画。