7

Ho un controller di visualizzazione che visualizza le viste di 2 controller di vista secondaria in una determinata area della sua vista. I 2 controller sottoselezione sono FlopVC e FipVC.transitionFromView: toView: durata: opzioni: completamento: non sta animando la transizione

Desidero animare la transizione da una vista secondaria all'altra. Il codice che sto utilizzando è:

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



} 

Le viste secondarie vengono scambiate, ma senza animazione. Che cosa sto facendo di sbagliato?

PS il progetto completo è here.

risposta

19
UIViewAnimationTransitionFlipFromLeft != UIViewAnimationOptionTransitionFlipFromLeft
+1

Ho avuto l'orribile sensazione che fosse qualcosa di stupido, ma non avevo idea che fosse così male. :-P Ti devo una birra alla prossima @nscoder_mad – cfischer

+0

Ah, ah ... è stato difficile, ho più errori stupidi ogni settimana. Accetterò la birra però :) – djromero

+2

Ruddy hell, ho appena fatto esattamente lo stesso errore. Grazie a Google + StackOverflow! :) (e ovviamente madmw!) –

3

se si utilizza il nuovo paradigma iOS5 vista del contenitore è necessario fare qualcosa sulla falsariga di quanto segue:

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



} 

riferimento la sezione Implementing a Container View Controller e il 2011 video WWDC sui contenitori UIViewController per maggiori informazioni.

+0

Per quanto riguarda il parametro "animazioni", i documenti indicano "Questo parametro non deve essere NULL." – benvolioT

+0

howdy. Non è NULL ma nulla e viene preso direttamente dal codice di esempio di Apple. per i documenti: "Un oggetto blocco contenente le modifiche da impegnare alle viste, in cui si modifica a livello di programmazione tutte le proprietà animabili delle viste nella gerarchia della vista.Questo blocco non accetta parametri e non ha valore restituito.Questo parametro non deve essere NULL. " puoi inviare nil perché puoi inviare un messaggio a nil. Non è possibile inviare un messaggio a NULL. – timthetoolman

+0

Grazie per il chiarimento - le mie radici Java stavano mostrando lì. :) – benvolioT

2

Ecco un codice funzionante che (per pura coincidenza) fa esattamente quello che stai descrivendo. I miei due bambini vc sono memorizzati in self->swappers. Il numero intero cur tiene traccia di quale sta attualmente visualizzando. Lo spot nella mia interfaccia in cui la sottoview deve andare è contrassegnato da una vista presa, 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 
         }];