Я реализовывал подобные вещи в прошлом. Но я бы переместил -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];
}];