Правильное использование переходаFromViewController: toViewController: продолжительность: параметры: анимация: завершение:

Я не могу найти хороший пример того, как правильно использовать transitionFromViewController:toViewController:duration:options:animations:completion:.

Это правильно? (предполагая, что я хочу поменять VC другим)

// Assume fromVC and toVC view controllers are defined and fromVC is already added as a child view controller
[self addChildViewController:toVC];

[self transitionFromViewController:fromVC toViewController:toVC duration:0.3 options:UIViewAnimationOptionTransitionCrossDissolve animations:NULL completion:^(BOOL finished) {
    [fromVC willMoveToParentViewController:nil];
    [fromVC removeFromParentViewController];
    [toVC didMoveToParentViewController:self];
}];

В документации не так ясно, когда звонить:

Метод addChildViewController: вызывает вызов метод willMoveToParentViewController:, который должен быть добавлен как ребенок, прежде чем добавлять его, но он не вызывает didMoveToParentViewController:. Контроллер контейнера класс должен вызвать didMoveToParentViewController: дочернего представления контроллер после перехода на новый ребенок завершен или, если нет перехода, сразу после вызова addChildViewController:.

Аналогичным образом, ответственность за управление представлением контейнера несет для вызова метода willMoveToParentViewController: перед вызовом removeFromParentViewController:. метод removeFromParentViewController: вызывает didMoveToParentViewController: для контроллера детского представления.

Другое дело, как вы используете блок анимации в этом случае? Обратите внимание, что в приведенном выше коде я просто положил NULL. (Я знаком с блоком как таковым, я просто не уверен, что поставить именно в этот)

Ответ 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];
                                   }];