¿Cuál es la forma correcta de cambiar el efecto de transición UINavigationController?

He visto a muchas personas preguntando cómo impulsar / UINavigationController s usando otras animaciones además del pnetworkingeterminado, como flip o curl .

El problema es que la pregunta / respuesta era relativamente antigua, lo que significa que tienen algunas cosas como [UIView beginAnimations:] (ejemplo aquí ) o usan dos enfoques muy diferentes.

El primero es usar las opciones transitionFromView:toView:duration:options:completion: UIView antes de presionar el controller (con el indicador de animation establecido en NO ), como el siguiente:

 UIViewController *ctrl = [[UIViewController alloc] init]; [UIView transitionFromView:self.view toView:ctrl.view duration:1 options:UIViewAnimationOptionTransitionFlipFromTop completion:nil]; [self.navigationController pushViewController:ctrl animated:NO]; 

Otra es utilizar CoreAnimation explícitamente con una CATransaction como la siguiente:

 // remember you will have to have the QuartzCore framework added to your project for this approach and also add <QuartzCore/QuartzCore.h> to the class this code is used CATransition* transition = [CATransition animation]; transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; transition.duration = 1.0f; transition.type = @"flip"; transition.subtype = @"fromTop"; [self.navigationController.view.layer removeAllAnimations]; [self.navigationController.view.layer addAnimation:transition forKey:kCATransition]; UIViewController *ctrl = [[UIViewController alloc] init]; [self.navigationController pushViewController:ctrl animated:NO]; 

Hay pros y los contras para ambos enfoques.

El primer enfoque me proporciona un código mucho más limpio, pero me impide utilizar animaciones como "suckEffect", "cubo" y otras .

El segundo enfoque se siente mal simplemente mirándolo. Comienza utilizando types de transiciones no documentadas (es decir, no está presente en la documentation de types de transición comunes de Referencia de class de CATransition ), lo que podría hacer que su aplicación sea rechazada de App Store (me refiero a que no pude encontrar ninguna reference de aplicaciones rechazadas porque estaba usando estas transactions, que también agradecería cualquier aclaración sobre este asunto), pero le da mucha más flexibilidad a sus animaciones, ya que puedo usar otros types de animation como "cameraIris", "rippleEffect", etc.

Con respecto a todo eso, ¿realmente necesito apelar para QuartzCore y CoreAnimation cada vez que necesito una transición UINavigationController más UINavigationController ? ¿Hay alguna otra forma de lograr el mismo efecto usando solo UIKit ?

De no ser así, ¿el uso de los valores de cadena como "flip" y "cubo" en lugar de las constantes pnetworkingefinidas ( kCATransitionFade , kCATransitionMoveIn , etc.) será un problema con respecto a la aprobación de mi aplicación en App Store?

Además, ¿hay otros pros y contras en relación con ambos enfoques que podrían ayudarme a decidir si elegir cada uno de ellos?

Con respecto a la aprobación de la AppStore, no creo que sea una solución basada en las bibliotecas de animation que usa. Puedes usar lo que creas conveniente para ti, y también puedes usarlos juntos. Desde un punto de vista personal, diría que CoreAnimation & QuartzCore son bastante increíbles cuando intentas agregar animation a un evento en particular. Es excelente debido al nivel de detalle que puede agregar a los componentes individuales.

Pero esas no son tus únicas opciones. Debería echar un vistazo a COCOS2D bibliotecas de COCOS2D para la animation. Son realmente increíbles y extremadamente simples de usar. Por ejemplo, si usar CoreAnimation te lleva 30 líneas de código, puedes usar COCOS2D y configurarlo con 3-5 líneas de código. Además, puede integrar Física con cada componente cuando utiliza el marco COCOS2D ( chipmunk ).