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

时间:2015-05-19 19:24:38

标签: objective-c ios8 uipresentationcontroller

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

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

- (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中覆盖NO以返回UIPresentationController但我仍然获得nil。我正在使用UIModalPresentationCustom作为我所呈现的视图的模式演示样式。

修改

我意识到我可以通过覆盖自定义presentationTransitionWillBegin中的UIPresentationController方法来动画显示视图来实现相同的效果。但我想得到一个关于访问呈现视图控制器的答案。

修改 由于我找到了一个解决方案,澄清了我的问题:(1)这是预期的行为,即presentViewController在动画对象中是否为零?

1 个答案:

答案 0 :(得分:1)

  

我使用UIModalPresentationCustom作为我所呈现的视图的模式演示样式。

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

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

顺便说一下,我发现你正在做一些你可能不应该做的事情。您不应该移动呈现视图控制器的视图。在您呈现的视图控制器的视图后面,可以更安全地获取呈现视图控制器视图的快照视图并在其中设置动画