Правильное использование transitionFromViewController: toViewController: продолжительность: опции: анимации: завершение: - PullRequest
33 голосов
/ 10 декабря 2011

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

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

// 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 Ответ

59 голосов
/ 10 декабря 2011

Я реализовывал подобные вещи в прошлом. Но я бы переместил -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];
                                   }];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...