53

Quiero mostrar una animación personalizada al presionar un controlador de vista: me gustaría lograr algo así como una animación "expandir", es decir, la nueva vista se expande desde un rectángulo dado, digamos [100,100 220,380] durante la animación a pantalla completa.Animación personalizada para empujar un UIViewController

¿Alguna sugerencia por dónde empezar, o cualquier documento, tutorial, enlace? :)


Alright. Podría hacer que la animación se expanden con el siguiente código:

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

Mi vista se muestra correctamente, pero por desgracia la barra de navegación y no se actualiza. ¿Hay alguna manera de hacerlo manualmente?


En el código de ejemplo, una función se llama todos los 0.03 segundos que actualiza la transformación de la vista. Desafortunadamente, al presionar UIViewController, no puedo cambiar el tamaño del marco de la vista ... ¿o sí?

Respuesta

25

Lo que podría hacer es pulsar el siguiente controlador de vista pero no se animan, así:

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

... y luego, en el controlador de vista que es ser empujado adentro, usted podría hacer una animación personalizada de su vista usando CoreAnimation. Esto podría hacerse mejor en el método viewDidAppear:(BOOL)animated.

Consulte Core Animation Guide para saber cómo hacer la animación. Mire particularmente la animación implícita.

EDIT:updated link

+3

He intentado este enfoque, pero el problema es que cuando usa este empuje, el primer controlador de vista desaparece antes de que el siguiente controlador comience a animar. Lo que debería suceder es: 1) el siguiente controlador de vista se anima y su vista cubre por completo la vista del viejo vc y luego aparece el viejo vc. Estoy compilando para iOS 4.3 y esto no está funcionando. – SpaceDog

+1

Esto tampoco es escalable. Un controlador de navegación debe manejar la animación. Este es un truco que debería implementar para cada controlador de vista que se empuje. –

3

Lo que quiere es las descargas para el capítulo 2 de iphone developers cookbook. Mire la muestra affineRotate específicamente, aunque cualquiera de las muestras principales de animatin lo ayudará.

+0

Gracias. Voy a mirarlo. – Erik

52

utilizo la siguiente función (añadido a UINavigationController) para personalizar la animación de empuje:

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

Creo que se puede adaptar este código para hacer lo animación que desee.

+2

Bueno, ¿cómo manejas el caso popViewController? por lo que puedo ver, tocar el botón Atrás no invoca ningún par objetivo/selector dado, incluso si sobrecarga el botón Atrás y proporciona uno, por lo que no puede configurarlo para que apunte a un método pop personalizado que incluya una animación. – crafterm

+0

Recuerdo pelear con las animaciones personalizadas por un tiempo y luego buscar una solución menos dolorosa. No recuerdo qué terminé usando, pero probablemente era algo parecido a la respuesta aceptada (o simplemente me rendí y usé una transición de fábrica). – zoul

+1

donde se supone que debo escribir este código? – ichanduu

7

@zoul: ¡Funcionó muy bien! Cambié "self" a "self.navigationController" y "self.view" a "self.navigationController.view" No sé si eso fue necesario, pero funcionó. Y @crafterm, como para hacer estallar hacia atrás, simplemente hacer su propio leftBarButtonItem añadiendo este código en 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]; 

A continuación, sólo pellizqué la función de empuje y hice esta función popWithTransition que llamé en mi método -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]; 
} 

Tenga en cuenta que la llamada popViewController se desplazó hasta el final, después de la animación. No sé si eso es kosher, pero de nuevo, funcionó.

10

Heinrich,

he hecho un tutorial de youtube que muestra cómo hacer que se expanden y se contraen puntos de vista, como en la aplicación para el iPhone facebook.

esperan que pueda ser de ayuda: How to make expanding/shrinking views on iPhone SDK

Adam

+0

bueno uno muy útil para yo – harshalb

+0

@ Adam, así que he estado aprendiendo de su tutorial para una aplicación de iPad. noté que el centro de la animación en modo horizontal no es correcto. ¿Qué se debe hacer para garantizar que la animación se vea correctamente cuando está en modo paisaje? Necesito decirle a la animación dónde deberían estar los límites iniciales. – topwik

34

El código que está buscando:

[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

Cómo manejar el escenario popViewController? – Ans

3

Tenga una mirada en ADTransitionController, una gota en el reemplazo para UINavigationController con la costumbre animaciones de transición (su API coincide con la API de UINavigationController) que creamos en Applidium.

Se pueden utilizar diferentes animaciones predefinidas para empuje y pop acciones tales como Flagelo, Fundido, Cubo, Carrusel y así sucesivamente. En su caso, la animación que está solicitando es la que se llama Zoom.

Cuestiones relacionadas