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

Animate the presenting controller view while animating presented controller view

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

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

- (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 returns nil。我在自定义 UIPresentationController 中将 shouldRemovePresentersView 覆盖为 return NO,但我仍然得到 nil。我正在使用 UIModalPresentationCustom 作为我正在呈现的视图的模态呈现样式。

编辑:

我意识到我可以通过重写我的自定义 UIPresentationController 中的 presentationTransitionWillBegin 方法来动画呈现视图,从而达到同样的效果。但我想得到有关访问呈现视图控制器的答案。

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

I am using UIModalPresentationCustom as the modal presentation style for the view that I am presenting.

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

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

顺便说一句,我突然想到(再考虑一下)你正在做一些你可能不应该做的事情。您不应该移动呈现视图控制器的视图。在呈现的视图控制器的视图后面拍摄 快照 视图并为 that 设置动画可能更安全。