Animate 2 UIViewControllers в UIContainerView - PullRequest
       47

Animate 2 UIViewControllers в UIContainerView

0 голосов
/ 25 сентября 2018

Привет всем Я анимирую отображение 2 UIViewController внутри UIContainerView.Для представления контроллеров представления я реализовал этот метод

#pragma mark - Animation Controller
-(void)moveViewControllerFrom:(UIViewController *)currentViewController toViewController:(UIViewController *)nextViewController {

    CGFloat widthVC = self.containerView.frame.size.width;
    CGFloat heightVC = self.containerView.frame.size.height;

    if (currentViewController == nextViewController) return;

    if (_isNextViewController) {
        nextViewController.view.frame = CGRectMake(widthVC, 0, widthVC, heightVC);
        [self addChildViewController:nextViewController];
        [currentViewController willMoveToParentViewController:nil];

        [self transitionFromViewController:currentViewController toViewController:nextViewController duration:.4 options:0 animations:^{

            nextViewController.view.frame = currentViewController.view.frame;
            currentViewController.view.frame = CGRectMake(0 - widthVC, 0, widthVC, heightVC);
        }
                                completion:^(BOOL finished) {
                                    [currentViewController removeFromParentViewController];
                                    [nextViewController didMoveToParentViewController:self];
                                }];
    }

    else {
        nextViewController.view.frame = CGRectMake(0 -widthVC, 0, widthVC, heightVC);
        [self addChildViewController:nextViewController];
        [currentViewController willMoveToParentViewController:nil];

        [self transitionFromViewController:currentViewController toViewController:nextViewController duration:.4 options:0 animations:^{

            nextViewController.view.frame = currentViewController.view.frame;
            currentViewController.view.frame = CGRectMake(widthVC, 0, widthVC, heightVC);
        }
                                completion:^(BOOL finished) {
                                    [currentViewController removeFromParentViewController];
                                    [currentViewController didMoveToParentViewController:self];
                                }];
    }
}

Теперь у меня возникает проблема, когда я быстро нажимаю кнопки «вперед» и «назад» (те, которые я использую, чтобы представить новый контроллер представления или перейтивернуться к предыдущему виду контроллера).Мое приложение аварийно завершает работу и возвращает мне эту ошибку:

*** Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Дочерние контроллеры представления и должны иметь общий родительский контроллер представления при вызове -[UIViewController transitionFromViewController: toViewController: продолжительность: опции: анимации: завершение:] '

Может кто-нибудь помочь мне понять, где я ошибаюсь в своем коде?

1 Ответ

0 голосов
/ 26 сентября 2018

Возможно, ваш currentViewController еще не полностью добавлен к self, когда вы вызываете moveViewController:toViewController во второй раз.Вы можете поместить подобное утверждение в начале вашего метода, чтобы проверить, правильно ли мое предположение:

NSAssert([self.childViewControllers containsObject:currentViewController], @"The currentViewController: %@ is not a childViewController, here are the current childViewControllers: %@", currentViewController, self.childViewControllers);

Редактировать: Если это предположение неверно, это, вероятно, будет полезноотредактировать ваш вопрос, чтобы включить ваши обращения к этому методу для дальнейшего контекста

...