Sobes.tech
Junior — Middle

¿De qué manera se puede implementar una transición animada personalizada al cambiar entre pantallas en un Navigation Controller?

sobes.tech AI

Respuesta de la IA

Para implementar una transición animada personalizada entre pantallas en UINavigationController, debes usar los protocolos UIViewControllerAnimatedTransitioning y UINavigationControllerDelegate.

  1. Crea una clase que implemente UIViewControllerAnimatedTransitioning, donde describas la lógica de la animación en los métodos:

    • transitionDuration(using:) — duración de la animación
    • animateTransition(using:) — la propia animación de transición
  2. Establece como delegado del UINavigationController un objeto que implemente UINavigationControllerDelegate, y en el método:

    func navigationController(_ navigationController: UINavigationController, 
                              animationControllerFor operation: UINavigationController.Operation, 
                              from fromVC: UIViewController, 
                              to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        // devuelve tu objeto de animación
        return customAnimator
    }
    

Ejemplo de un animador personalizado simple:

class CustomAnimator: NSObject, UIViewControllerAnimatedTransitioning {
    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return 0.3
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        guard let toView = transitionContext.view(forKey: .to) else {
            transitionContext.completeTransition(false)
            return
        }
        let container = transitionContext.containerView
        toView.alpha = 0
        container.addSubview(toView)

        UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
            toView.alpha = 1
        }) { finished in
            transitionContext.completeTransition(finished)
        }
    }
}