iOs Segue animation de izquierda a derecha (horizontal)

Soy casi un novato en Xcode 4. ¿Hay una manera de agregar a una segue una animation de transición personalizada que no esté entre las cuatro presentadas por el Interface Builder en la gestión de storyboards? Específicamente, quiero una animation similar a la "cubierta vertical" normal, pero horizontal. Quiero que la vista pase a otra deslizándose de izquierda a derecha (o de derecha a izquierda) en lugar de pasar de arriba hacia abajo como sucede en la transición de "cubrir vertical". Lo intenté con el gesto de deslizar pero sin fortuna: incluso eso está haciendo la transición de arriba hacia abajo y, de todos modos, no entiendo por qué la transición pnetworkingeterminada es de arriba hacia abajo cuando la transición pnetworkingeterminada de toda la aplicación suele ser derecha a izquierda o izquierda a la derecha, especialmente en el caso de deslizar …

Intenté también una forma programática pero sin fortuna, incluso en este caso, usando este código:

#import "JHCustomSegue.h" @implementation JHCustomSegue - (void) perform { UIViewController *src = (UIViewController *) self.sourceViewController; UIViewController *dst = (UIViewController *) self.destinationViewController; [UIView transitionWithView:src.navigationController.view duration:0.5 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{ [src presentModalViewController:dst animated:NO]; } completion:NULL]; } @end 

En el generador de interfaces definí esta class como la class de mi segue. Usando breakpoint, lo vi entrar en la function perfom pero … ¡no realice! Bloqué la aplicación en modo vertical (no sé si es un problema). Intenté ejecutar la aplicación en un ipad real y en un iphone simulado. El mismo problema.

Puede usar CATransition dentro de una Segue personalizada para lograr la transición de izquierda a derecha. Agregue esta #import "QuartzCore / QuartzCore.h" a su Segue personalizado

 -(void)perform { __block UIViewController *sourceViewController = (UIViewController*)[self sourceViewController]; __block UIViewController *destinationController = (UIViewController*)[self destinationViewController]; CATransition* transition = [CATransition animation]; transition.duration = .25; transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; transition.type = kCATransitionPush; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade transition.subtype = kCATransitionFromLeft; //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom [sourceViewController.navigationController.view.layer addAnimation:transition forKey:kCATransition]; [sourceViewController.navigationController pushViewController:destinationController animated:NO]; } 

Basado en la presentación de Zakir Hyder, aquí está la misma funcionalidad traducida a Swift:

 override func perform() { var sourceViewController = self.sourceViewController as UIViewController var destinationViewController = self.destinationViewController as UIViewController var transition: CATransition = CATransition() transition.duration = 0.25 transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) transition.type = kCATransitionPush; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade transition.subtype = kCATransitionFromLeft; //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom sourceViewController.navigationController?.view.layer.addAnimation(transition, forKey: "kCATransition") sourceViewController.navigationController?.pushViewController(destinationViewController, animated: false) } 

Aquí está el código de trabajo para la seque personalizado cuando no se usa el controller de navigation.

 -(void)perform { UIViewController *sourceViewController = (UIViewController*)[self sourceViewController]; UIViewController *destinationController = (UIViewController*)[self destinationViewController]; CATransition* transition = [CATransition animation]; transition.duration = 0.25; transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; transition.type = kCATransitionMoveIn; //kCATransitionMoveIn; //, kCATransitionPush, kCATransitionReveal, kCATransitionFade transition.subtype = kCATransitionFromRight; //kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom [destinationController.view.layer addAnimation:transition forKey:kCATransition]; [sourceViewController presentViewController:destinationController animated:NO completion:nil]; } 

Mira este ejemplo en Github:

https://github.com/itinance/iOSCustomSegue

Utiliza una segue personalizada de derecha a izquierda en una aplicación de ejemplo explícitamente sin UINavigationController como el abridor de hilos donde se solicita.

El código en la respuesta de Sahil no funcionó para mí en iOS 8. Entonces tuve que investigar un poco más sobre este tema.

'UIView animateWithDuration' funciona en iOS 8, mientras que 'destinationController.view.layer addAnimation: transition' no hace nada en combinación con presentViewController.

Intenté usar Segue para hacer el mismo efecto también, pero sin éxito. En su lugar, utilicé una solución:

 // get the view that's currently showing UIView *currentView = self.view; // get the the underlying UIWindow, or the view containing the current view UIView *theWindow = [currentView superview]; UIView *newView = aTwoViewController.view; // remove the current view and replace with myView1 [currentView removeFromSuperview]; [theWindow addSubview:newView]; // set up an animation for the transition between the views CATransition *animation = [CATransition animation]; [animation setDuration:0.5]; [animation setType:kCATransitionPush]; [animation setSubtype:kCATransitionFromRight]; [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; [[theWindow layer] addAnimation:animation forKey:@"SwitchToView2"]; 

Puede download el proyecto de muestra aquí . ¡Aclamaciones!