Sobes.tech
Junior — Middle

De que forma pode implementar uma transição animada personalizada ao passar entre telas num Navigation Controller?

sobes.tech IA

Resposta da IA

Para implementar uma transição animada personalizada entre telas no UINavigationController, deve usar os protocolos UIViewControllerAnimatedTransitioning e UINavigationControllerDelegate.

  1. Crie uma classe que implemente UIViewControllerAnimatedTransitioning, onde descreve a lógica da animação nos métodos:

    • transitionDuration(using:) — duração da animação
    • animateTransition(using:) — a própria animação de transição
  2. Defina como delegado do UINavigationController um objeto que implemente UINavigationControllerDelegate, e no método:

    func navigationController(_ navigationController: UINavigationController, 
                              animationControllerFor operation: UINavigationController.Operation, 
                              from fromVC: UIViewController, 
                              to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        // devolve o seu objeto de animação
        return customAnimator
    }
    

Exemplo de um animador personalizado simples:

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