Ответ 1
Я реализовал подобные вещи аналогично в прошлом. Но я бы переместил -willMoveToParentViewController:
за пределы блока завершения, так как этот контроллер представления должен быть уведомлен до того, как он будет перемещен (т.е. К моменту завершения блока завершения fromVC
уже установлен его родительский VC на nil
. Итак, в целом, что-то вроде этого:
[self addChildViewController:toVC];
[fromVC willMoveToParentViewController:nil];
[self transitionFromViewController:fromVC toViewController:toVC duration:0.3 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{} completion:^(BOOL finished) {
[fromVC removeFromParentViewController];
[toVC didMoveToParentViewController:self];
}];
В терминах анимации вы никогда не должны устанавливать этот параметр в NULL
, согласно документации метода. Если у вас нет свойств вида, которые нужно оживить, вы можете просто передать ему пустой блок ^{}
. В основном этот параметр используется для анимации свойств ваших представлений в иерархии вашего представления во время перехода. Список анимационных свойств можно найти в документации UIView под заголовком "Анимация". В качестве примера, скажем, вы не хотите, чтобы весь ваш взгляд обрабатывался с помощью fromVC
, чтобы пересечь растворение, но только хотите, чтобы одно подзадача в своей иерархии представлений с именем subview1
исчезла. Вы можете сделать это, используя блок анимации:
[self addChildViewController:toVC];
[fromVC willMoveToParentViewController:nil];
[self transitionFromViewController:fromVC
toViewController:toVC
duration:0.3
options:UIViewAnimationOptionTransitionNone
animations:^{
[subview1 setAlpha:0.0];
}
completion:^(BOOL finished) {
[fromVC removeFromParentViewController];
[toVC didMoveToParentViewController:self];
}];