web-dev-qa-db-fra.com

Comment animer des contrôleurs de vue enfant lors de l'ajout ou de la suppression d'un contrôleur de vue de conteneur?

J'ai les 2 fonctions suivantes qui ajoutent et suppriment des contrôleurs de vue enfant déclenchés à partir d'un contrôleur de vue conteneur:

@discardableResult func addChildViewController(withChildViewController childViewController: UIViewController) -> UIViewController {
    // Add Child View Controller
    addChildViewController(childViewController)
    childViewController.beginAppearanceTransition(true, animated: true)
    // Add Child View as Subview
    view.addSubview(childViewController.view)
    // Configure Child View
    childViewController.view.frame = view.bounds
    childViewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    // Notify Child View Controller
    childViewController.didMove(toParentViewController: self)
    return childViewController
}
@discardableResult func removeChildViewController(withChildViewController childViewController: UIViewController) -> UIViewController {
    // Notify Child View Controller
    childViewController.willMove(toParentViewController: nil)
    childViewController.beginAppearanceTransition(false, animated: true)
    // Remove Child View From Superview
    childViewController.view.removeFromSuperview()
    // Notify Child View Controller
    childViewController.removeFromParentViewController()
    return childViewController
}

Les fonctions ci-dessus sont des extensions de UIViewController. Par conséquent, je ne fais que self.addChildViewController () et self.removeChildViewController () sur le contrôleur de vue parent.

Comment puis-je animer la vue supprimée lors de sa sortie et la vue ajoutée lors de son entrée?

7
John Doe

Animation entre différents contrôleurs de vue enfant: - 

func cycleFromViewController(oldViewController: UIViewController, toViewController newViewController: UIViewController) {
    oldViewController.willMove(toParentViewController: nil)
    newViewController.view.translatesAutoresizingMaskIntoConstraints = false

    self.addChildViewController(newViewController)
    self.addSubview(subView: newViewController.view, toView:self.containerView!)

    newViewController.view.alpha = 0
    newViewController.view.layoutIfNeeded()

    UIView.animate(withDuration: 0.5, delay: 0.1, options: .transitionFlipFromLeft, animations: { 
        newViewController.view.alpha = 1
        oldViewController.view.alpha = 0
    }) { (finished) in
        oldViewController.view.removeFromSuperview()
        oldViewController.removeFromParentViewController()
        newViewController.didMove(toParentViewController: self)
    }
}

En haut, 

  • oldViewController: - Vue actuelle de l'enfant viewController 
  • newViewController: - Nouveau contrôleur de vue enfant qui va être ajouté 
  • containerView: - Une vue dans laquelle tous les contrôleurs enfants s'affichent. 

Pour animer une vue enfant, vous pouvez utiliser un type de style d'animation différent en remplaçant transitionFlipFromLeft par disponible UIViewAnimationOptions exigence.

4
Sagar Thummar

La réponse de Sagar n'est pas complète La méthode addSubview y manque

Voici la réponse complète

func cycleFromViewController(oldViewController: UIViewController, toViewController newViewController: UIViewController) {
        oldViewController.willMove(toParentViewController: nil)
        newViewController.view.translatesAutoresizingMaskIntoConstraints = false

        self.addChildViewController(newViewController)
        self.addSubview(subView: newViewController.view, toView:self.containerView!)

        newViewController.view.alpha = 0
        newViewController.view.layoutIfNeeded()

        UIView.animate(withDuration: 0.5, delay: 0.1, options: .transitionFlipFromLeft, animations: {
            newViewController.view.alpha = 1
            oldViewController.view.alpha = 0
        }) { (finished) in
            oldViewController.view.removeFromSuperview()
            oldViewController.removeFromParentViewController()
            newViewController.didMove(toParentViewController: self)
        }
    }

    //--------------------------------------------------------------------------------


   private func addSubview(subView:UIView, toView parentView:UIView) {
        self.view.layoutIfNeeded()
        parentView.addSubview(subView)

        subView.leadingAnchor.constraint(equalTo: parentView.leadingAnchor).isActive = true
        subView.topAnchor.constraint(equalTo: parentView.topAnchor).isActive = true
        subView.bottomAnchor.constraint(equalTo: parentView.bottomAnchor).isActive = true
        subView.trailingAnchor.constraint(equalTo: parentView.trailingAnchor).isActive  = true
    }

J'espère que c'est utile à quelqu'un 

0
Prashant Tukadiya