[英]How do I animate child view controllers when adding to/removing from a container view controller?
我有以下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替換為可用的UIViewAnimationOptions來使用不同類型的動畫樣式。
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
}
希望對別人有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.