iphone - started - Uso apropiado de transitionFromViewController: toViewController: duration: options: animations: completion:
ios getting started (1)
Parece que no puedo encontrar un buen ejemplo sobre cómo usar transitionFromViewController:toViewController:duration:options:animations:completion:
properly.
¿Es esto correcto? (suponiendo que quiera cambiar un VC por otro)
// 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];
}];
La documentación no es tan clara acerca de cuándo llamar a qué:
El método addChildViewController llama al método willMoveToParentViewController: del controlador de vista para agregarse como un elemento secundario antes de agregarlo, pero no llama al método didMoveToParentViewController : . La clase de controlador de vista de contenedor debe llamar a didMoveToParentViewController: del controlador de vista secundaria después de completar la transición al nuevo elemento secundario o, si no hay transición, inmediatamente después de llamar al método addChildViewController : .
Del mismo modo, es responsabilidad del controlador de vista de contenedor llamar al método willMoveToParentViewController: antes de llamar al método removeFromParentViewController : . El método removeFromParentViewController llama al método didMoveToParentViewController: del controlador de vista hijo.
Otra cosa es, ¿cómo se usa el bloque de animaciones en este caso? Observe en el código anterior que acabo de poner NULL
. (Estoy familiarizado con el bloqueo per se, simplemente no estoy seguro de qué poner exactamente en este)
Implementé este tipo de cosas de manera similar en el pasado. Pero, movería -willMoveToParentViewController:
fuera del bloque de finalización, ya que ese controlador de vista debería ser notificado antes de que se mueva (es decir, para cuando se haya ejecutado el bloque de finalización, fromVC
ya ha establecido que su VC padre es nil
. , algo como esto:
[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];
}];
En términos de animaciones, nunca debe establecer este parámetro en NULL
, según la documentación del método. Si no tiene propiedades de vista que quiera animar, simplemente puede pasarle un bloque vacío ^{}
. Básicamente, este parámetro se usa para animar propiedades de sus vistas en su jerarquía de vistas durante la transición. La lista de propiedades animables se puede encontrar en la documentación de UIView debajo del encabezado "Animaciones". Como ejemplo, supongamos que no desea que su totalidad sea manejada por fromVC
para disolverse en forma cruzada, sino que solo desea que una subvista en su jerarquía de vista llamada subview1
desvanezca. Puedes hacer esto usando el bloque de animaciones:
[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];
}];