53

Voglio mostrare un'animazione personalizzata quando si spinge un controller di visualizzazione: mi piacerebbe ottenere qualcosa come un'animazione "expand", ovvero la nuova vista si espande da un determinato rettangolo, diciamo [100,100 220,380] durante l'animazione a schermo intero.Animazione personalizzata per la spinta di un UIViewController

Qualche suggerimento da cui partire, rispettivamente documenti, esercitazioni, collegamenti? :)


OK. Ho potuto fare l'animazione espandere con il seguente codice:

if ([coming.view superview] == nil) 
    [self.view addSubview:coming.view]; 
    coming.view.frame = CGRectMake(160,160,0,0); 
    [UIView beginAnimations:@"frame" context:nil]; 
    [UIView setAnimationDuration:4]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [coming viewWillAppear:YES]; 
    [going viewWillAppear:YES]; 
    coming.view.frame = CGRectMake(0, 0, 320, 480); 
    [going viewDidDisappear:YES]; 
    [coming viewDidAppear:YES]; 
    [UIView commitAnimations]; 

La mia opinione è visualizzato correttamente, ma purtroppo la barra di navigazione non viene aggiornato. C'è un modo per farlo manualmente?


Nel codice di esempio, viene chiamata una funzione tutti 0,03 secondi che aggiorna la trasformazione della vista. Sfortunatamente, quando si preme un UIViewController, non riesco a ridimensionare la cornice della vista ... vero?

risposta

25

Che cosa si potrebbe fare è spingere il controller della vista successivo, ma non animarlo, in questo modo:

[self.navigationController pushViewController:nextController animated:NO]; 

... e poi, nel controller della vista che è sempre spinto in, si potrebbe fare un'animazione personalizzata della vista usando CoreAnimation. Questo potrebbe essere fatto meglio nel metodo viewDidAppear:(BOOL)animated.

Verificare il Core Animation Guide su come effettivamente fare l'animazione. Guarda in particolare l'animazione implicita.

EDIT:updated link

+3

Ho provato questo approccio, ma il problema è che quando si usa questo pulsante, il primo controller di visualizzazione scompare prima che il controller successivo inizi l'animazione. Quello che dovrebbe accadere è: 1) il controller della vista successiva si anima e la sua vista copre completamente la vecchia vc's view e quindi la vecchia vc si apre. Sto compilando per iOS 4.3 e questo non funziona. – SpaceDog

+1

Anche questo non è scalabile. Un controller di navigazione dovrebbe gestire l'animazione. Questo è un trucco che dovresti implementare per ogni controller di visualizzazione che viene spinto. –

3

Quello che vuoi è il download per il capitolo 2 di iphone developers cookbook. Guarda l'esempio affineRotate in modo specifico, anche se alcuni dei principali campioni di animatin ti aiuteranno.

+0

Grazie. Lo lancerò. – Erik

52

Io uso la seguente funzione (aggiunto alla UINavigationController) per personalizzare l'animazione push:

- (void) pushController: (UIViewController*) controller 
     withTransition: (UIViewAnimationTransition) transition 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [self pushViewController:controller animated:NO]; 
    [UIView setAnimationDuration:.5]; 
    [UIView setAnimationBeginsFromCurrentState:YES];   
    [UIView setAnimationTransition:transition forView:self.view cache:YES]; 
    [UIView commitAnimations]; 
} 

Credo che si potrebbe adattare questo codice per fare quello dell'animazione che si desidera.

+2

Piacevole, come gestisci il caso popViewController? da quello che riesco a vedere, toccando il pulsante Indietro non si richiama alcuna coppia target/selettore, anche se sovraccarichi il pulsante Indietro e ne fornisci uno, quindi non puoi impostarlo per puntare a un metodo pop personalizzato che include un'animazione? – crafterm

+0

Ricordo di aver combattuto con le animazioni personalizzate per un po 'e poi di aver preso una soluzione meno dolorosa. Non riesco a ricordare cosa ho finito per usare, ma probabilmente era qualcosa di simile alla risposta accettata (o semplicemente ho rinunciato e ho usato una transizione di fabbrica). – zoul

+1

dove dovrei scrivere questo codice? – ichanduu

7

@zoul: Funzionava benissimo! Ho appena cambiato "self" in "self.navigationController" e "self.view" in "self.navigationController.view" Non so se fosse necessario, ma ha funzionato. E @crafterm, come per popping indietro, basta fare il proprio leftBarButtonItem aggiungendo questo codice nella viewDidLoad o viewWillAppear:

//add your own left bar button 
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonTapped)]; 
self.navigationItem.leftBarButtonItem = backButton; 
[backButton release]; 

Poi ho solo ottimizzato la funzione push e ho fatto questa funzione popWithTransition che ho chiamato nel mio metodo -backButtonTapped .

- (void) popWithTransition: (UIViewAnimationTransition) transition 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:.75]; 
    [UIView setAnimationBeginsFromCurrentState:YES];   
    [UIView setAnimationTransition:transition forView:self.navigationController.view cache:YES]; 
    [UIView commitAnimations]; 
[self.navigationController popViewControllerAnimated:NO]; 
} 

Si noti che la chiamata popViewController è stata spostata verso il basso fino alla fine, dopo l'animazione. Non so se è kosher, ma, di nuovo, ha funzionato.

10

Heinrich,

ho fatto un tutorial YouTube che mostra come fare vista si espandono e si restringono, come nel facebook per iPhone.

spero che possa essere di aiuto: How to make expanding/shrinking views on iPhone SDK

Adam

+0

buon uno molto utile per me – harshalb

+0

@Adam, quindi ho imparato da te tutorial per un'app per iPad. ho notato che il centro dell'animazione in modalità orizzontale non è corretto. cosa si deve fare per garantire che l'animazione sia corretta quando si è in modalità orizzontale? ho bisogno di dire all'animazione dove dovrebbero essere i limiti iniziali. – topwik

34

Il codice che state cercando:

[UIView beginAnimations:@"View Flip" context:nil]; 
[UIView setAnimationDuration:0.80]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 

[UIView setAnimationTransition: 
UIViewAnimationTransitionFlipFromRight 
         forView:self.navigationController.view cache:NO]; 


[self.navigationController pushViewController:menu animated:YES]; 
[UIView commitAnimations]; 
+0

Come gestire lo scenario popViewController? – Ans

3

Dai un'occhiata alla ADTransitionController, un calo nel rimontaggio per UINavigationController con l'abitudine animazioni di transizione (la sua API corrisponde all'API di UINavigationController) che abbiamo creato su Applidium.

È possibile utilizzare diverse animazioni predefinite per spinta e pop azioni quali Swipe, Fade, Cube, Carrousel e così via. Nel tuo caso, l'animazione che stai richiedendo è quella chiamata Zoom.

Problemi correlati