Sobes.tech
Junior — Middle

Come si può implementare una transizione animata personalizzata durante il passaggio tra schermate in un Navigation Controller?

sobes.tech AI

Risposta dell'AI

Per implementare una transizione animata personalizzata tra schermate in UINavigationController, è necessario utilizzare i protocolli UIViewControllerAnimatedTransitioning e UINavigationControllerDelegate.

  1. Creare una classe che implementa UIViewControllerAnimatedTransitioning, dove si descrive la logica dell'animazione nei metodi:

    • transitionDuration(using:) — durata dell'animazione
    • animateTransition(using:) — l'animazione stessa
  2. Impostare come delegato del UINavigationController un oggetto che implementa UINavigationControllerDelegate, e nel metodo:

    func navigationController(_ navigationController: UINavigationController, 
                              animationControllerFor operation: UINavigationController.Operation, 
                              from fromVC: UIViewController, 
                              to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        // restituisce il tuo oggetto di animazione
        return customAnimator
    }
    

Esempio di un animatore personalizzato semplice:

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