2010-03-03 16 views
10

Así que recién estoy comenzando a desarrollar algunas aplicaciones simples para el iphone. Diré que estoy bastante seguro de que aún no entiendo muy bien la programación para múltiples vistas, pero estoy tratando de aprender sobre la marcha.iPhone CATransition agrega un fundido al comienzo y al final de cualquier animación?

Tengo un programa que comenzó como una aplicación simple basada en la ventana para poder escribir todo a la mano con la esperanza de aprender más sobre lo que estoy haciendo. Tengo un solo controlador de vista que actúa para cargar y liberar vistas según lo solicitado por cada uno de los otros controladores de vista. Ningún elemento persiste de una vista a la otra.

Actualmente estoy trabajando bien, pero quería agregar animaciones para cambiar la vista. Una simple animación push fue mi objetivo. Un punto de vista empuja hacia fuera como la nueva vista empuja.

Mirando hacia CATransitions y tratando de que, tengo una versión de trabajo (en la actualidad para empujar la parte superior/inferior)

 [thisView.view removeFromSuperview]; 
     [thisView release]; 
     thisView = [[MenuViewController alloc] initWithNibName:@"MenuView" bundle:nil]; 
     [self.view addSubview:thisView.view]; 

     CATransition *animation = [CATransition animation]; 
     [animation setDuration:6.3]; 
     [animation setType:kCATransitionPush]; 
     [animation setSubtype:kCATransitionFromTop]; 
     [animation setRemovedOnCompletion:YES]; 
     [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]]; 
     [[self.view layer] addAnimation:animation forKey:nil]; 

por lo que yo puedo decir que esto es código bastante estándar para usar CATransition y funciona para hacer lo que necesito, una vista se empuja hacia arriba cuando entra la otra vista. Sin embargo, mi problema es que parece que hay un desvanecimiento en cada vista a medida que entran o salen respectivamente.

Como tal - en este ejemplo; a medida que el menú sube desde la parte inferior, se desvanecerá muy lentamente desde el blanco, y a medida que la vista anterior abandona la pantalla, se desvanecerá lentamente a blanco.

Tenga en cuenta que la duración se establece en 6 para que el desvanecimiento sea espectacular.

¿Hay alguna manera de eliminar el desvanecimiento aquí para que cada vista permanezca sólida al entrar y al salir? ¿O me he perdido la marca por completo en esta ruta que estoy tomando?

Agradezco cualquier ayuda. Disculpas, he estado sin aliento.

Respuesta

4

Nunca he podido encontrar una solución a este problema, pero puedo ofrecer una solución razonable. Lo que está sucediendo es que no se está volviendo blanco, sino que se está volviendo transparente, y el fondo de la ventana (o lo que sea que esté detrás) es blanco. Hay varias formas de evitar esto:

  1. Cambie el color de fondo de la ventana. Si ambas vistas con las que se está desvaneciendo tienen el mismo color de fondo sólido, esto se verá bastante bien.

  2. No renderice un fondo en cada vista ("MenuView", por ejemplo), sino que tenga una vista de fondo compartida que esté debajo de esas vistas en todo momento.

Tenga en cuenta que esto no funcionará en todas las circunstancias - agrupados UITableView s, por ejemplo, siempre son completamente opacas.

(Como nota al margen que, supongo que no se construye una aplicación basada en la navegación, en cuyo caso toda la animación debe ser manejado de forma automática.)

También puede ser que desee considerar el mirar en el UIView método setAnimationTransition:forView:cache: si aún no lo ha hecho como otra forma de transición entre vistas (aunque no puede hacer una animación deslizante, si está configurado en eso).

+0

Agradezco la ayuda. Comencé este proyecto como una aplicación de vista de ventana simple. En parte porque no estaba completamente al tanto de cómo usar un proyecto basado en navegación, y en parte porque pensé que sería una buena forma de aprender cómo funciona todo esto. Analizaré las opciones de fondo y el setAnimationTransition, como yo lo entiendo, puedes traducirlo al fotograma y enviarlo a animaciones sin tener que usar las transiciones de stock, ¿sí? Podría ser capaz de burlar una solución alternativa. Creo que necesito leer más sobre lo que es posible con una aplicación basada en la navegación. –

+0

En general, si está haciendo una aplicación que se supone que debe verse como "una aplicación de iPhone" - 'UITabBars' y' UITableViews' y demás - entonces debe hacerlo con las implementaciones incluidas ('pushViewController:' y tal) o Apple seguramente lo rechazará como una violación del HIG (a menos que realmente seas bueno duplicando el aspecto y la sensación). Y sí, es posible usar '[UIView beginAnimations]' para hacer más animaciones personalizadas si eso es lo que quieres hacer. –

+0

La apariencia no se parece en nada a una "aplicación de iPhone". Agradezco tu ayuda aquí. Me voy a quedar con las transiciones para esto y solo acepto el fundido de entrada/salida - y trato de descubrir [UIView beginAnimations] la próxima vez y ver si me gusta eso. –

0

Pude obtener las vistas de transición sin desvanecimiento al principio y al final mediante el uso de la animación UIView. NOTA: En el siguiente código, tengo un UINavigationController y un UITabBarController dentro de una UIView principal. El UIVIew principal (containerView) es lo que agregué como subvista a la ventana de la aplicación. Los otros dos son subvistas de containerView.

UITabBarController *tabBarController = [(AppDelegate_iPhone *)[[UIApplication sharedApplication] delegate] tabBarController]; 
UIView *containerView = [(AppDelegate_iPhone *)[[UIApplication sharedApplication] delegate] containerView]; 
UINavigationController *accountsNavigationController = [(AppDelegate_iPhone *)[[UIApplication sharedApplication] delegate] accountsNavigationController]; 

CGRect accountsNavigationControllerEndFrame = containerView.frame; 
CGRect tabBarControllerEndFrame = CGRectMake(containerView.frame.size.width, containerView.frame.origin.y, containerView.frame.size.width, containerView.frame.size.height); 
[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:0.4]; 
tabBarController.view.frame = tabBarControllerEndFrame; 
accountsNavigationController.view.frame = accountsNavigationControllerEndFrame; 
[UIView commitAnimations]; 
2

que resolvieron este encerrando la vista a la que he aplicado el efecto en un supervista y estableciendo la propiedad supervista "subvistas de clip". ahora el desvanecimiento es "recortado" por la supervista.

+2

¿Podría quizás agregar algún código de muestra para esto? –

+0

Esto funcionó perfectamente para mí. Gracias. – Divya

+0

no debes mover la vista muy lejos y solo tienes suerte, no es visible – malhal

Cuestiones relacionadas