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) } ) }}