Prawidłowe użycie transitionFromViewController: toViewController: czas trwania: opcje: animacje: zakończenie:

Nie mogę znaleźć dobrego przykładu, jak prawidłowo używać transitionFromViewController:toViewController:duration:options:animations:completion:.

Czy to prawda? (zakładając, że chcę zamienić VC na inny)
// 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];
}];

Dokumentacja nie jest tak jasna, kiedy nazwać co:

Metoda addChildViewController: wywołuje willMoveToParentViewController: metoda kontrolera widoku dodany jako dziecko przed dodaniem go, ale nie wywołuje didMoveToParentViewController: metoda. Kontroler widoku kontenera klasa musi wywołać didMoveToParentViewController: widoku potomnego kontroler po przejściu na nowe dziecko jest kompletny lub, jeśli nie ma przejścia, natychmiast po wywołaniu addchildviewcontroller: metoda.

Podobnie, to jest odpowiedzialność container view controller aby wywołać metodę willMoveToParentViewController: przed wywołaniem removeFromParentViewController: metoda. Na removeFromParentViewController: metoda wywołuje didMoveToParentViewController: metoda kontrolera widoku potomnego.

Inna sprawa, jak w tym przypadku wykorzystać blok animacji? Odnotuj w powyższym kodzie właśnie wpisałem NULL. (Jestem zaznajomiony z Blockiem per se, po prostu nie jestem pewien, co dokładnie umieścić w tym)

Author: pixelfreak, 2011-12-10

1 answers

Realizowałem tego typu rzeczy podobnie w przeszłości. Ale, chciałbym przenieść -willMoveToParentViewController: poza blok zakończeń, ponieważ kontroler widoku powinien być powiadomiony, zanim zostanie przeniesiony (tj. do czasu uruchomienia bloku zakończeń, fromVC miał już swój macierzysty VC ustawiony na nil. Więc w sumie coś takiego:

[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];
}];

Jeśli chodzi o animacje, nigdy nie należy ustawiać tego parametru na NULL, zgodnie z dokumentacją metody. Jeśli nie masz właściwości widoku, które chcesz animować, a następnie po prostu przekazać mu pusty blok ^{}. Zasadniczo ten parametr jest używany do animowania właściwości widoków w hierarchii widoków podczas przejścia. Listę właściwości, które można animować można znaleźć w dokumentacji UIView pod nagłówkiem "animacje". Jako przykład, powiedzmy, że nie chcesz, aby cały widok obsługiwany przez fromVC krzyżował się z rozpuścić, ale chcesz, aby tylko jeden subview w hierarchii widoku o nazwie subview1 zniknął. Możesz to zrobić za pomocą animacji blok:

[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];
                                   }];
 59
Author: Sean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-10 18:23:28