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];
после завершения анимации.
После этого ошибка "Несбалансированные звонки..." также исчезла.