コンテナービューコントローラーからトリガーされた子ビューコントローラーを追加および削除する次の2つの関数があります。
@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
}
上記の関数はUIViewControllerの拡張機能であるため、親ビューコントローラーでself.addChildViewController()とself.removeChildViewController()を実行するだけです。
途中で削除されるビューと、途中で追加されるビューをアニメーション化するにはどうすればよいですか?
異なる子ビューコントローラー間でのアニメーション化:-
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)
}
}
上記では、
子ビューをアニメーション化するには、必要に応じてtransitionFlipFromLeftを利用可能なIViewAnimationOptionsに置き換えることで、さまざまなタイプのアニメーションスタイルを使用できます。
Sagarの回答が完全ではありませんaddSubview
メソッドがありません
ここに完全な答えがあります
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
}
それが誰かに役立つことを願っています