Подтвердить что ты не робот

Контейнерный вид, исчезающий при полном переходе:

Я использую настраиваемые переходы контроллера контроллера, UIViewControllerAnimatedTransitioning, чтобы представить и отклонить контроллер вида.

Представленная анимация работает отлично, но когда я запускаю анимацию увольнения, как только я вызываю completeTransition:, удаляется containerView.

Я не уверен, что происходит, вот код перехода:

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    UIView *containerView = [transitionContext containerView];
    containerView.backgroundColor = [UIColor blackColor];

    if (self.reverse) {
        [containerView addSubview:toViewController.view];
        [containerView addSubview:fromViewController.view];
    } else {
        [containerView addSubview:fromViewController.view];
        [containerView addSubview:toViewController.view];
    }

    if (! self.reverse) { // Forward
        toViewController.view.frame = CGRectMake(-containerView.frame.size.width, 0, containerView.frame.size.width, containerView.frame.size.height);
    } else {
        fromViewController.view.frame = CGRectMake(0, 0, containerView.frame.size.width, containerView.frame.size.height);
    }

    [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0 usingSpringWithDamping:0.75f initialSpringVelocity:1.0f options:UIViewAnimationOptionCurveLinear animations:^{
        if (self.reverse) {
            fromViewController.view.frame = CGRectMake(-containerView.frame.size.width, 0, containerView.frame.size.width, containerView.frame.size.height);
            fromViewController.view.layer.opacity = 0.f;
            toViewController.view.layer.opacity = 1.f;
        } else {
            toViewController.view.frame = CGRectMake(0, 0, containerView.frame.size.width, containerView.frame.size.height);
            toViewController.view.layer.opacity = 1.f;
            fromViewController.view.layer.opacity = 0.3f;
        }
    } completion:^(BOOL finished) {
        [transitionContext completeTransition:finished];
    }];
}

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext {
    if (self.reverse) {
        return 0.45;
    } else {
        return 0.35;
    }
}

Как я могу предотвратить исчезновение моего toViewController, если для параметра .reverse установлено значение YES?

Обновление: Вот как я представляю контроллер представления:

SecondaryViewController *vc = [[SecondaryViewController alloc] init];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:vc];
navigationController.modalPresentationStyle = UIModalPresentationCustom;
navigationController.transitioningDelegate = self;
[self presentViewController:navigationController animated:YES completion:nil];
4b9b3361

Ответ 1

Вид контейнера, исчезающий при увольнении, является правильным поведением. Ваша ошибка добавляет к ней fromView.

Вы неправильно определяете, является ли это презентацией или увольнением, и что вы должны делать в каждом случае. Просто используйте два контроллера вида fromViewController и toViewController, чтобы разделить их; при увольнении, роли отменены. При увольнении не добавляйте ничего в представление контента; исходный презентатор все еще присутствует и будет обнаружен путем удаления контейнера.

Итак, при представлении добавьте только контейнер toView в представление контейнера. При увольнении не добавляйте ничего в контейнер. Это так просто.