在动画呈现控制器视图的同时动画呈现控制器视图

Posted

技术标签:

【中文标题】在动画呈现控制器视图的同时动画呈现控制器视图【英文标题】:Animate the presenting controller view while animating presented controller view 【发布时间】:2015-05-19 19:24:37 【问题描述】:

我有一个视图控制器,它在某些操作上显示另一个覆盖屏幕下半部分的视图控制器。

当我从底部为第二个视图控制器(呈现的视图控制器)设置动画以覆盖屏幕的下半部分时,我还希望将呈现的视图动画到屏幕的上半部分。请参阅下面的代码 -

- (void)animatePresentationWithTransitioningContext:(id<UIViewControllerContextTransitioning>) transitioningContext

    UIViewController *presentedController = [transitioningContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView *presentedControllerView = [transitioningContext viewForKey:UITransitionContextToViewKey];
    UIView *containerView = [transitioningContext containerView];

    presentedControllerView.frame = [transitioningContext finalFrameForViewController:presentedController];

    CGPoint center = presentedControllerView.center;
    center.y = containerView.bounds.size.height;
    presentedControllerView.center = center;

    [containerView addSubview:presentedControllerView];

    // This returns nil
    UIView *presentingControllerView = [transitioningContext viewForKey:UITransitionContextFromViewKey];

    [UIView animateWithDuration:[self transitionDuration:transitioningContext] delay:0.0 usingSpringWithDamping:1.0 initialSpringVelocity:0.0 options:UIViewAnimationOptionAllowUserInteraction animations:^
        CGPoint presentedViewCenter = presentedControllerView.center;
        presentedViewCenter.y -= containerView.bounds.size.height/2.0;
        presentedControllerView.center = presentedViewCenter;

        // This is where I want to move the presenting view controller.
        // of course it does not work.
        CGPoint presentingViewCenter = presentingControllerView.center;
        presentingViewCenter.y -= containerView.bounds.size.height/2.0;
        presentingControllerView.center = presentingViewCenter;

     completion:^(BOOL finished) 
        [transitioningContext completeTransition:finished];
    ];

viewForKey:UITransitionContextFromViewKey 返回nil。我覆盖了shouldRemovePresentersView 以在我的自定义UIPresentationController 中返回NO,但我仍然得到nil。我正在使用UIModalPresentationCustom 作为我正在呈现的视图的模态呈现样式。

编辑:

我意识到我可以通过在我的自定义UIPresentationController 中覆盖presentationTransitionWillBegin 方法来为呈现视图设置动画来实现相同的效果。但我想获得有关访问呈现视图控制器的答案。

编辑: 由于我找到了解决方案,因此澄清了我的问题:(1)这是预期的行为,即presentingViewController 在动画对象中将为零?

【问题讨论】:

您已经证明无法通过第一种方式完成,并且您知道如何通过第二种方式完成,因此目前尚不清楚您要问什么。您应该回答自己的问题,展示您的解决方案,然后继续前进。 @matt 见我上面的编辑 - “既然我找到了解决方案,澄清我的问题:(1)这是预期的行为,即presentingViewController 在动画对象中将为零?” 我回答了。 【参考方案1】:

我使用 UIModalPresentationCustom 作为我正在呈现的视图的模态呈现样式。

嗯,这就是你的问题。在这种情况下,From 视图将为 nil。除非您使用 FullScreen 演示样式,否则它为零。

我并不是说您将演示风格设置为Custom 是错误的。您需要这样做,if 您想保留呈现视图控制器的视图,而 if 您想提供自己的演示控制器。你也是!但在这种情况下,工作是分工的:呈现控制器负责视图的最终位置。

顺便说一句,我突然想到(再想一想)你正在做一些你可能不应该做的事情。您不应该移动呈现视图控制器的视图。拍摄当前视图控制器的视图的快照 视图并在所显示的视图控制器的视图后面动画那个 可能会更安全。

【讨论】:

如果您理解正确,您建议不要使用自定义动画师。对吗? 一点也不!自定义过渡动画是我最喜欢的 ios 7/8 功能。我只是在描述动画师和演示控制器如何协同工作。工作需要正确划分,例如我在这里做的:github.com/mattneub/custom-alert-view-iOS7/blob/master/… 可能使用演示控制器不是解决我要解决的问题的正确方法。我想同时访问呈现控制器和呈现控制器 - 用户应该能够与它们进行交互(例如,滚动一个,在另一个中添加文本)。我意识到当呈现的控制器被呈现时,用户无法与呈现的控制器交互。不确定是否总是这样,如果是这样,我应该尝试其他方法。 "用户应该能够与他们两个交互" 那么你不应该首先使用呈现的视图控制器,因为与不同的视图控制器交互是完全不可能的。您应该简单地使用在另一个视图上滑动的视图。 或者,如果你真的想使用第二个视图控制器,那么创建你自己的自定义容器(父)视图控制器,这样它就可以同时显示子视图控制器的视图和它自己的视图,类似于拆分视图控制器的作用。

以上是关于在动画呈现控制器视图的同时动画呈现控制器视图的主要内容,如果未能解决你的问题,请参考以下文章

如何自定义模态视图控制器呈现动画?

在没有动画的情况下关闭视图控制器后立即呈现视图控制器

为啥我的 UIBarButtonItem 在呈现视图控制器时会进行动画滑入?

我怎样才能呈现一个模态视图控制器,并带有默认的关闭动画?

用动画呈现视图

嵌入到导航控制器中的动画根视图控制器以模态方式呈现