iOS Segue - Left to Right - iOS Segue - Left to Right - ios ios

iOS Segue - Left to Right -


This is how I achieve the effect without requiring a nav-controller. Try this instead:

Swift 4:

import UIKitclass SegueFromLeft: 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: .curveEaseInOut,                         animations: {                                dst.view.transform = CGAffineTransform(translationX: 0, y: 0)                                },                        completion: { finished in                                src.present(dst, animated: false, completion: nil)                                    }                        )    }}

Swift 3:

import UIKitclass SegueFromLeft: UIStoryboardSegue{    override func perform()    {        let src = self.sourceViewController        let dst = self.destinationViewController        src.view.superview?.insertSubview(dst.view, aboveSubview: src.view)        dst.view.transform = CGAffineTransformMakeTranslation(-src.view.frame.size.width, 0)        UIView.animateWithDuration(0.25,            delay: 0.0,            options: UIViewAnimationOptions.CurveEaseInOut,            animations: {                dst.view.transform = CGAffineTransformMakeTranslation(0, 0)            },            completion: { finished in                src.presentViewController(dst, animated: false, completion: nil)            }        )    }}

Then in the storyboard, click on the segue you'd like to change. In the attributes inspector change the type to 'Custom' and change the class to 'SegueFromLeft'


Here is a custom-segue class you can use to perform a left-to-right segue in Swift. It requires QuartzCore framework and minimal animation.

Swift 2.2

import UIKitimport QuartzCoreclass SegueFromLeft: UIStoryboardSegue {    override func perform() {        let src: UIViewController = self.sourceViewController        let dst: UIViewController = self.destinationViewController        let transition: CATransition = CATransition()        let timeFunc : CAMediaTimingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)        transition.duration = 0.25        transition.timingFunction = timeFunc        transition.type = kCATransitionPush        transition.subtype = kCATransitionFromLeft        src.navigationController!.view.layer.addAnimation(transition, forKey: kCATransition)        src.navigationController!.pushViewController(dst, animated: false)    }}

Swift 3.0

import UIKitimport QuartzCoreclass SegueFromLeft: UIStoryboardSegue {    override func perform() {        let src: UIViewController = self.source        let dst: UIViewController = self.destination        let transition: CATransition = CATransition()        let timeFunc : CAMediaTimingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)        transition.duration = 0.25        transition.timingFunction = timeFunc        transition.type = kCATransitionPush        transition.subtype = kCATransitionFromLeft        src.navigationController!.view.layer.add(transition, forKey: kCATransition)        src.navigationController!.pushViewController(dst, animated: false)    }}

The "Back" button will still appear in the navigation bar on the transitioned view controller, but you can easily disable/configure the navigation controller for that view controller.


Updated accepted answer in Swift 3:

import UIKitclass SegueFromLeft: 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)            }        )    }}