iOS: прозрачный фоновый модал в раскадровке с использованием UIModalPresentationCurrentContext не работает

Я видел кучу примеров на SO, которые делают то же самое в обычае UIStoryBoardSegue"s perform метод для реализации модального с прозрачным фоном, но когда я пытаюсь сделать это, как только анимация заканчивается и вызывается presentViewController, черный фон модала мгновенно возвращается обратно. Вот код:

- (void)perform {
    UIViewController *sourceViewController = self.sourceViewController;
    UIViewController *destinationViewController = self.destinationViewController;

    sourceViewController.modalPresentationStyle = UIModalPresentationCurrentContext;

    [sourceViewController.view addSubview:destinationViewController.view];
    destinationViewController.view.alpha = 0;

    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        destinationViewController.view.alpha = 1;
    } completion:^(BOOL finished) {
        [destinationViewController.view removeFromSuperview];

        // boom, the black background returns!
        [sourceViewController presentViewController:destinationViewController animated:NO completion:^{
            // these have no effect
            destinationViewController.view.backgroundColor = [UIColor clearColor];
            destinationViewController.view.superview.backgroundColor = [UIColor clearColor];
        }];
    }];
}

Я также устанавливаю модальный presentationStyle в "Текущий контекст" в исходном VC через IB:

Я не использую UINavigationController,

Как вы можете видеть, я попытался установить цвет фона контроллера представления назначения, суперпредставление контроллера представления назначения, настройку .modalPresentationStyle на sourceViewController и destinationViewController, но, похоже, ничего не работает!

Если я закомментирую часть, которая удаляет представление назначения из его суперпредставления, и presentViewController: звоните, все работает нормально, но затем VC назначения освобождается, поэтому я не могу взаимодействовать с ним и / или раскрутить его позже. Действительно в недоумении здесь.

Изменить: Еще одна проблема, которую я вижу в консоли после перехода по этому маршруту, Unbalanced calls to begin/end appearance transitions for <UIViewController: 0x7f86a042c114>. ошибка.

1 ответ

Решение

Решено:

Таким образом, похоже, что нет способа (насколько я могу судить) выполнить пользовательский модальный переход с прозрачным фоном, полностью заключенным в perform метод.

Решение состояло в том, чтобы установить мой собственный переход как transitionDelegate внутри perform а затем сделать анимацию в animateTransition: вместо. Наконец, позвоните [transitionContext completeTransition:YES]; после завершения анимации.

После этого ошибка "Несбалансированные звонки..." также исчезла.