Reputation: 39
is it possible to define a type of transition when I instantiate and present a viewcontroller?
This code generates a default fade type transition, but I need it to appear from left to right, is it possible?
Thank you!
@IBAction func botonVolverFamilias(_ sender: Any) {
let sw = revealViewController()
self.view.window?.rootViewController = sw
let viewControllerModelos = storyboard!.instantiateViewController(withIdentifier: "vc_catalogo_familias") as! VC_catalogo
let navigationController = UINavigationController(rootViewController: viewControllerModelos)
navigationController.navigationBar.isHidden=false
navigationController.setNavigationBarHidden(true, animated: false)
sw!.setFront(navigationController, animated: true)
}
Upvotes: 0
Views: 795
Reputation: 1396
You may go with Following,
let sw = revealViewController()
self.view.window?.rootViewController = sw
let viewControllerModelos = storyboard!.instantiateViewController(withIdentifier: "vc_catalogo_familias") as! VC_catalogo
let navigationController = UINavigationController(rootViewController: viewControllerModelos)
navigationController.navigationBar.isHidden=false
navigationController.setNavigationBarHidden(true, animated: false)
let trans = CATransition()
trans.duration = 0.5
trans.type = kCATransitionPush
trans.subtype = kCATransitionFromLeft
trans.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
sw.view.window!.layer.add(trans, forKey: kCATransition)
sw!.setFront(navigationController, animated: true)
Upvotes: 0
Reputation: 3064
What you need to use to change the transition for a UINavigationController
is find the first UIViewController
in your stack. You should make an extension of this UIViewController
as an UIViewControllerTransitioningDelegate
and an UINavigationControllerDelegate
.
You can then call func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?
to define what sort of transition you want to present new UIViewControllers
with.
So, in order to do this, we have to create a custom UIViewControllerAnimatedTransitioning
class and return it in this UIViewControllerTransitioningDelegate
method. Here is the example of the one I use.
import UIKit
class SimpleOver: NSObject, UIViewControllerAnimatedTransitioning {
var direction: TransitionDirection!
init(direction: TransitionDirection) {
self.direction = direction
}
var popStyle: Bool = false
func transitionDuration(
using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.20
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
if popStyle {
animatePop(using: transitionContext)
return
}
let fz = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)!
let tz = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!
let f = transitionContext.finalFrame(for: tz)
let fOff = f.offsetBy(dx: f.width, dy: 0)
tz.view.frame = fOff
transitionContext.containerView.insertSubview(tz.view, aboveSubview: fz.view)
UIView.animate(
withDuration: transitionDuration(using: transitionContext),
animations: {
tz.view.frame = f
for subview in fz.view.subviews {
subview.alpha = 0
}
}, completion: {_ in
transitionContext.completeTransition(true)
})
}
func animatePop(using transitionContext: UIViewControllerContextTransitioning) {
let fz = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)!
let tz = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!
let f = transitionContext.initialFrame(for: fz)
let fOffPop = f.offsetBy(dx: f.width, dy: 0)
transitionContext.containerView.insertSubview(tz.view, belowSubview: fz.view)
UIView.animate(
withDuration: transitionDuration(using: transitionContext),
animations: {
fz.view.frame = fOffPop
for subview in tz.view.subviews {
subview.alpha = 1
}
}, completion: {_ in
transitionContext.completeTransition(true)
})
}
}
enum TransitionDirection {
case left
case right
}
Then, within our func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?
method, we can simply return this UIViewControllerAnimatedTransitioning
as so:
extension YourViewController: UIViewControllerTransitioningDelegate, UINavigationControllerDelegate {
func navigationController(
_ navigationController: UINavigationController,
animationControllerFor operation: UINavigationController.Operation,
from fromVC: UIViewController,
to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
//This tells our navigation controller the style that we want to animate our transition between view controllers
let simpleOver = SimpleOver(direction: .right)
simpleOver.popStyle = (operation == .pop)
return simpleOver
}
}
Upvotes: 1