Ios 7 пользовательский подарок и отклонение перехода

Я делаю пользовательские присутствующие и отклоняю переходы и имею некоторые проблемы с ним. Я хочу повторить эту крутую анимацию в iOS 7 (когда мы открываем/закрываем какое-то приложение). У меня есть первый и второй контроллеры. Все анимации находятся в первом контроллере (он поддерживает UIViewControllerTransitioningDelegate и UIViewControllerAnimatedTransitioning). Итак, я просто проверяю: если он представляет - я делаю одну анимацию (масштабируя первое и второе представление), если она отклоняется - я делаю другую анимацию (уменьшая первое и второе представление). Присутствующая анимация работает нормально, проблема возникает с увольнением анимации. По какой-то причине, когда я уменьшаю свой второй контроллер (это UINavigationController), я вижу за ним черный фон (и это неправильно, потому что я хочу видеть мой первый контроллер, пока он уменьшает масштаб). Вот мой код от First Controller

- (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;
}

Скажите, пожалуйста, если я должен предоставить дополнительный код или экраны. Спасибо заранее!

Ответ 1

Вам нужно установить modalPresentationStyle = UIModalPresentationCustom на toVC, прежде чем представить его, если вы хотите сохранить значение fromVC в иерархии окон после завершения текущего перехода.

См. мою реализацию примерного кода для WWDC Session 218: Пользовательские переходы с использованием контроллеров View. Если вы нажмете "Опции", вы увидите этот тип перехода. Соответствующий код находится в SOLViewController.m prepareForSegue: и SOLOptionsTransitionAnimator.m

https://github.com/soleares/SOLPresentingFun

Ответ 2

Когда вы представляете пользовательский VC, вы должны использовать: vc.modalPresentationStyle = UIModalPresentationCustom; но, если вы набрали неправильно  vc.modalTransitionStyle = UIModalPresentationCustom; вы получите черный фон за пользовательским VC.

Ответ 3

Я думаю, что неплохо использовать два отдельных класса AnimationController для анимации Present и Dismiss и реализовать UIViewControllerTransitioningDelegate (animationControllerForPresentedController и animationControllerForDismissedController) внутри вашего родительского ViewController.

Чтобы создать AnimationController только подкласс NSObject и реализовать UIViewControllerAnimatedTransitioning там.

Надеюсь, что это поможет.