ios 7自定义呈现和解除过渡

Nas*_*ban 11 iphone objective-c ios ios7

我正在制作自定义存在并解除转换并且存在一些问题.我想要做的是在iOS 7中重复这个很酷的深度动画(当我们打开/关闭一些应用程序时).我有第一和第二控制器.所有动画都在First控制器中(它支持UIViewControllerTransitioningDelegate和UIViewControllerAnimatedTransitioning).所以,我只是检查:如果它正在呈现 - 我正在做一个动画(放大第一和第二个视图),如果它正在解雇 - 我正在做另一个动画(缩小第一个和第二个视图).当前动画工作正常,解雇动画时会出现问题.出于某种原因,当我缩小我的第二个控制器(它是UINavigationController)时,我看到它背后的黑色背景(这是错误的,因为我希望在它缩小时看到我的第一个控制器).

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
    UIView *transitionView = [transitionContext containerView];

    id toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    id fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

    BOOL isPresenting;

    isPresenting = [toViewController isKindOfClass:[UINavigationController class]];

    UINavigationController *navigator = isPresenting ? toViewController : fromViewController;

    if (isPresenting) {
        [transitionView addSubview:navigator.view];
        navigator.view.transform = CGAffineTransformMakeScale(0.1, 0.1);
        navigator.view.alpha = 0;
    }

    navigator.view.center = self.startButton.center;

    void(^AnimationBlock)(void) = ^ {
        if (isPresenting) {
            navigator.view.transform = CGAffineTransformMakeScale(1, 1);
            self.view.transform = CGAffineTransformMakeScale(4, 4);
            navigator.view.alpha = 1;
            self.startButton.alpha = 0;
        } else {
            navigator.view.transform = CGAffineTransformMakeScale(0.1, 0.1);
            self.view.transform = CGAffineTransformMakeScale(1, 1);
            navigator.view.alpha = 0;
            self.startButton.alpha = 1;
        }
    };

    [UIView animateWithDuration:1
                          delay:0.0f
         usingSpringWithDamping:50.0
          initialSpringVelocity:4
                        options:UIViewAnimationOptionLayoutSubviews
                     animations:^{
                         AnimationBlock();
    } completion:^(BOOL finished) {
        [transitionContext completeTransition:YES];
        if (!isPresenting) {
            [navigator.view removeFromSuperview];
        }
    }];
}

- (void)completeTransitionInContext:(id<UIViewControllerContextTransitioning>)transitionContext{
    [transitionContext completeTransition:YES];
}


- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext{
    return 1;
}


- (id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {
    return self;
}

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {
    return self;
}
Run Code Online (Sandbox Code Playgroud)

请告诉我是否应该提供一些额外的代码或屏幕.提前致谢!

Jes*_*sse 10

如果要在当前转换完成后将fromVC保留在窗口层次结构中,则需要在呈现它之前在toVC上设置modalPresentationStyle = UIModalPresentationCustom.

请参阅我对WWDC会话218的示例代码的实现:使用视图控制器的自定义转换.如果单击"选项",您将看到此类转换.相关代码位于SOLViewController.m prepareForSegue:和SOLOptionsTransitionAnimator.m中

https://github.com/soleares/SOLPresentingFun


hai*_*ing 6

当您呈现自定义VC时,您应该使用: vc.modalPresentationStyle = UIModalPresentationCustom; 但是,如果输入错误, vc.modalTransitionStyle = UIModalPresentationCustom; 您将在自定义VC后面获得黑色背景.


Art*_*tem 3

我认为最好使用两个单独的AnimationController类来表示 Present 和 Dismiss 动画,并在 Parent ViewController 中实现 UIViewControllerTransitioningDelegate (animationControllerForPresentedController和)。animationControllerForDismissedController

创建一个AnimationController只是子类NSObjectUIViewControllerAnimatedTransitioning在那里实现。

希望能帮助到你。