Cómo presentar el controller de vista de derecha a izquierda en iOS usando Swift

Estoy usando presentViewController para presentar una nueva pantalla

let dashboardWorkout = DashboardWorkoutViewController() presentViewController(dashboardWorkout, animated: true, completion: nil) 

Esto presenta una nueva pantalla de arriba a abajo, pero quiero que se presente de derecha a izquierda sin usar UINavigationController .

Estoy usando Xib en lugar de storyboard, entonces ¿cómo puedo hacer eso?

No importa si es xib o storyboard que estás usando. Normalmente, la transición de derecha a izquierda se usa cuando empujas un controller de vista al UINavigiationController del UINavigiationController .

Echa un vistazo a esta respuesta SO . La solución es similar a la sugerida por @Lion, pero la animation funciona en la self.view.window no en la vista del controller de la vista de destino. Versión Swift con animation correcta:

Swift 2.x

 let transition = CATransition() transition.duration = 0.5 transition.type = kCATransitionPush transition.subtype = kCATransitionFromRight view.window!.layer.addAnimation(transition, forKey: kCATransition) presentViewController(dashboardWorkout, animated: false, completion: nil) 

Swift 3 y 4

 let transition = CATransition() transition.duration = 0.5 transition.type = kCATransitionPush transition.subtype = kCATransitionFromRight view.window!.layer.add(transition, forKey: kCATransition) present(dashboardWorkout, animated: false, completion: nil) 

ObjC

 CATransition *transition = [[CATransition alloc] init]; transition.duration = 0.5; transition.type = kCATransitionPush; transition.subtype = kCATransitionFromRight; [self.view.window.layer addAnimation:transition forKey:kCATransition]; [self presentViewController:dashboardWorkout animated:false completion:nil]; 

Parece que el parámetro animated en el método presentViewController realmente no importa en este caso de transición personalizada. Puede ser de cualquier valor, true o false .

Completar el código para presentar / despedir, Swift 3

 extension UIViewController { func presentDetail(_ viewControllerToPresent: UIViewController) { let transition = CATransition() transition.duration = 0.25 transition.type = kCATransitionPush transition.subtype = kCATransitionFromRight self.view.window!.layer.add(transition, forKey: kCATransition) present(viewControllerToPresent, animated: false) } func dismissDetail() { let transition = CATransition() transition.duration = 0.25 transition.type = kCATransitionPush transition.subtype = kCATransitionFromLeft self.view.window!.layer.add(transition, forKey: kCATransition) dismiss(animated: false) } } 

Prueba esto,

  let animation = CATransition() animation.duration = 0.5 animation.type = kCATransitionPush animation.subtype = kCATransitionFromRight animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) vc.view.layer.addAnimation(animation, forKey: "SwitchToView") self.presentViewController(vc, animated: false, completion: nil) 

Aquí vc es viewcontroller, dashboardWorkout en su caso.

También puede usar segue personalizado.

Swift 3

 class SegueFromRight: UIStoryboardSegue { override func perform() { let src = self.source let dst = self.destination src.view.superview?.insertSubview(dst.view, aboveSubview: src.view) dst.view.transform = CGAffineTransform(translationX: src.view.frame.size.width, y: 0) UIView.animate(withDuration: 0.25, delay: 0.0, options: UIViewAnimationOptions.curveEaseInOut, animations: { dst.view.transform = CGAffineTransform(translationX: 0, y: 0) }, completion: { finished in src.present(dst, animated: false, completion: nil) } ) } } 

¡testing esto!

 let transition: CATransition = CATransition() transition.duration = 0.3 transition.type = kCATransitionReveal transition.subtype = kCATransitionFromLeft self.view.window!.layer.addAnimation(transition, forKey: nil) self.dismissViewControllerAnimated(false, completion: nil) 

Tengo una solución mejor que me ha funcionado si quieres mantener la animation clásica de Apple, sin ver esa transición "negra" que ves usando CATransition (). Simplemente use el método popToViewController.

Puede search el viewController que necesita en

 self.navigationController.viewControllers // Array of VC that contains all VC of current stack 

Puede search el viewController que necesita al search its restrationIdentifier.

TENGA CUIDADO: por ejemplo, si está navegando a través de 3 controlleres de vista, y al llegar al último, desea abrir el primero. Perderá, en este caso, la reference al controller de vista SEGUNDO efectivo porque el popToViewController lo sobrescribió. Por cierto, hay una solución: puede save fácilmente antes de popToViewcontroller, el VC que necesitará más adelante. Me funcionó muy bien.

controller de vista actual de derecha a izquierda en iOS usando Swift

 func FrkTransition() { let transition = CATransition() transition.duration = 2 transition.type = kCATransitionPush transitioningLayer.add(transition,forKey: "transition") // Transition to "blue" state transitioningLayer.backgroundColor = UIColor.blue.cgColor transitioningLayer.string = "Blue" } 

Refrence por: [ https://developer.apple.com/documentation/quartzcore/catransition%5D%5B1%5D

Esto funcionó para mí:

 self.navigationController?.pushViewController(controller, animated: true)