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?
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,
Pour animer une vue enfant, vous pouvez utiliser un type de style d'animation différent en remplaçant transitionFlipFromLeft par disponible UIViewAnimationOptions exigence.
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