7

Tengo un controlador de vista que muestra las vistas de 2 controladores de subvista en un área dada de su vista. Los 2 controladores de subvista son FlopVC y FipVC.transitionFromView: toView: duration: options: completion: no está animando la transición

Quiero animar la transición de una vista secundaria a la otra. El código que estoy usando es:

-(IBAction)flip:(id)sender{ 

    UIViewController *newVC = nil; 

    if (self.isFlip) { 
     newVC = [[FlopVC alloc] initWithNibName:nil bundle:nil]; 
    }else{ 
     newVC = [[FipVC alloc] initWithNibName:nil bundle:nil]; 
    } 

    newVC.view.frame = CGRectMake(120, 20, 240, 260); 
    [self.view addSubview:newVC.view]; 

    [UIView transitionFromView:self.currentVC.view 
         toView:newVC.view 
         duration:0.9 
         options:UIViewAnimationTransitionFlipFromLeft 
        completion:^(BOOL finished) { 
         self.currentVC = newVC; 
         self.isFlip = ! self.isFlip; 
        }]; 



} 

Las subvistas se intercambian, pero sin ninguna animación. ¿Qué estoy haciendo mal?

PS el proyecto completo es here.

Respuesta

19
UIViewAnimationTransitionFlipFromLeft != UIViewAnimationOptionTransitionFlipFromLeft
+1

Tuve la horrible sensación de que era algo estúpido, pero no tenía idea de que era tan malo. :-P Te debo una cerveza en el próximo @nscoder_mad – cfischer

+0

Ja, ja ... fue complicado, tengo más errores estúpidos cada semana. Aunque aceptaré la cerveza :) – djromero

+2

Ruddy hell, acabo de cometer exactamente el mismo error. Gracias Google + stackoverflow! :) (y madmw por supuesto!) –

3

si está utilizando el nuevo paradigma IOS5 vista de contenedor que hay que hacer algo en la línea de lo siguiente:

-(IBAction)flip:(id)sender{ 

    UIViewController *newVC = nil; 

    if (self.isFlip) { 
     newVC = [[FlopVC alloc] initWithNibName:nil bundle:nil]; 
    }else{ 
     newVC = [[FipVC alloc] initWithNibName:nil bundle:nil]; 
    } 

    newVC.view.frame = CGRectMake(120, 20, 240, 260); 

    // required for the new viewController container 
    self.currentVC willMoveToParentViewController:nil]; 
    [self addChildViewController:newVC]; 
    [self transitionFromViewController:self.currentVC 
        toViewViewController:newVC.view 
           duration:0.9 
           options: UIViewAnimationOptionTransitionFlipFromLeft 
          animations:nil 
          completion:^(BOOL finished) { 
           // required for the new viewController container 
           [self.currentVC removeFromParentViewController]; 
           [newVC didMoveToParentViewController:self]; 

           self.currentVC=newVC; 
          }]; 



} 

referencia la sección Implementing a Container View Controller y los WWDC 2011 videos en contenedores UIViewController para más información.

+0

Con respecto al parámetro "animaciones", los documentos indican "Este parámetro no debe ser NULO". – benvolioT

+0

howdy. No es NULO sino nulo y se toma directamente del Código de muestra de Apple. según los documentos: "Un objeto de bloque que contiene los cambios para comprometerse con las vistas. Aquí se cambian las propiedades animables de las vistas en la jerarquía de su vista. Este bloque no toma parámetros ni tiene valor de retorno. Este parámetro no debe ser NULO. " puedes enviar nil porque puedes enviar un mensaje a nil. No puedes enviar un mensaje a NULL. – timthetoolman

+0

Gracias por la aclaración: mis raíces Java se mostraban allí. :) – benvolioT

2

Aquí está el código de trabajo que (por pura coincidencia) hace exactamente lo que está describiendo. Mis dos hijos vc se almacenan en self->swappers. El número entero cur realiza un seguimiento de cuál se está mostrando actualmente. El punto en mi interfaz donde irá la subvista está marcado por un punto de vista, panel.

UIViewController* fromvc = [self->swappers objectAtIndex:cur]; 
cur = (cur == 0) ? 1 : 0; 
UIViewController* tovc = [self->swappers objectAtIndex:cur]; 
tovc.view.frame = self.panel.bounds; 

// must have both as children before we can transition between them 
[self addChildViewController:tovc]; // "will" called for us 
// note: when we call remove, we must call "will" (with nil) beforehand 
[fromvc willMoveToParentViewController:nil]; 

[self transitionFromViewController:fromvc 
        toViewController:tovc 
          duration:0.4 
          options:UIViewAnimationOptionTransitionFlipFromLeft 
         animations:nil 
         completion:^(BOOL done){ 
          // note: when we call add, we must call "did" afterwards 
          [tovc didMoveToParentViewController:self]; 
          [fromvc removeFromParentViewController]; // "did" called for us 
         }]; 
Cuestiones relacionadas