2012-08-17 6 views
7

Estoy tratando de usar UIViewController de transitionFromViewController: toViewController: método de duración pero con una animación personalizada.Animación personalizada entre UIViewControllers utilizando transitionFromViewController: toViewController: duración

I tienen los siguientes dos controladores de vista añadidos como los niños a una UIViewController contenedor personalizado:

  1. firstController - Este es un ejemplo de UITabBarController
  2. secondController - Esta es una subclase de UIViewController

El siguiente código funciona como se esperaba:

[self transitionFromViewController:firstController 
        toViewController:secondController 
          duration:2           
          options:UIViewAnimationOptionTransitionFlipFromLeft 
         animations:^(void){} 
         completion:^(BOOL finished){}]; 

Sin embargo, me gustaría crear una animación personalizada donde firstController se desliza hacia la izquierda y se reemplaza por secondController deslizándose desde la derecha, similar a cómo funcionan los métodos push y pop UINavigationControllers. Después de cambiar el options al UIViewAnimationOptionTransitionNone intenté implementar animaciones personalizadas en el bloque animations pero no he tenido ningún éxito. firstController se intercambia inmediatamente por secondController sin y animaciones.

Realmente agradecería cualquier ayuda.

Gracias

Respuesta

15

Esto es realmente muy fácil. Por alguna razón, asumí que la vista de secondController estaría debajo/detrás de la de firstController. Solo intenté animar la vista firstController. Esto, por supuesto, está mal. Tan pronto como se llame al transitionFromViewController:toViewController:durationsecondController, la vista se coloca sobre la vista firstController. El siguiente código funciona:

CGFloat width = self.view.frame.size.width; 
CGFloat height = self.view.frame.size.height; 

secondController.view.frame = CGRectMake(width, 0, width, height); 

[self transitionFromViewController:firstController 
    toViewController:secondController 
    duration:0.4 
    options:UIViewAnimationOptionTransitionNone 
    animations:^(void) { 
     firstController.view.frame = CGRectMake(0 - width, 0, width, height); 
     secondController.view.frame = CGRectMake(0, 0, width, height); 
    } 
    completion:^(BOOL finished){ 
     [secondController didMoveToParentViewController:self]; 
    } 
]; 
+6

Debe llamar a [secondController didMoveToParentViewController: self]; en el manejador de finalización también :) – banDedo

+1

@banDedo Actualicé el código con eso. Gracias por señalar eso. Necesito eso! –

+0

banDedo y Shaun F. Gracias por la sugerencia y la edición. – Simple99

Cuestiones relacionadas