Sobes.tech
Junior — Middle

Πώς μπορεί να υλοποιηθεί μια προσαρμοσμένη κινούμενη μετάβαση κατά τη μετάβαση μεταξύ οθονών σε έναν Navigation Controller;

sobes.tech AI

Απάντηση από AI

Για να υλοποιήσετε μια προσαρμοσμένη κινούμενη μετάβαση μεταξύ οθονών σε UINavigationController, πρέπει να χρησιμοποιήσετε τα πρωτόκολλα UIViewControllerAnimatedTransitioning και UINavigationControllerDelegate.

  1. Δημιουργήστε μια κλάση που υλοποιεί το UIViewControllerAnimatedTransitioning, όπου περιγράφετε τη λογική της κινούμενης εικόνας στα μεθόδους:

    • transitionDuration(using:) — διάρκεια της μετάβασης
    • animateTransition(using:) — η ίδια η μετάβαση
  2. Ορίστε ως αντιπρόσωπο του UINavigationController ένα αντικείμενο που υλοποιεί το UINavigationControllerDelegate, και στη μέθοδο:

    func navigationController(_ navigationController: UINavigationController, 
                              animationControllerFor operation: UINavigationController.Operation, 
                              from fromVC: UIViewController, 
                              to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        // επιστρέψτε το αντικείμενο της κινούμενης εικόνας σας
        return customAnimator
    }
    

Παράδειγμα ενός απλού προσαρμοσμένου κινούμενου animator:

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