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:
.
// 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)
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];
}];
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