概述
约定:
底层控制器:在层级较低的控制器,由它创建新控制器
转场控制器:就是底层控制器创建的新控制器
转场控制器被创建出来,若要自定义转场的动画,比如从中心逐渐放大知道占据满屏,这样系统没有提供的动画,就需要底层控制器来创建新的转场动画。
首先需要底层控制器创建新控制器的时候,给新控制器约定管理转场与动画的代理。如:
accountVC.transitioningDelegate = self
当然这里也可以不使用当前控制器作为转场动画的代理,而是重新创建一个对象作为转场动画的代理。这个部分放在文末解释。
然后底层控制器需要实现相关的协议,即实现控制器转场协议:
UIViewControllerTransitioningDelegate
指定管理转场动画的对象,这里制定管理动画的对象为底层控制器。
如:
extension BasicController:UIViewControllerTransitioningDelegate{
//返回控制自定义转场动画 的 控制器
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return self
}
}
然后便是底层控制器实现相关的协议:
extension BasicController : UIViewControllerAnimatedTransitioning{
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.5
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
}
}
transitionContext是转场动画的上下文,和绘图上下文一个意思。
由于自定义动画转场了,所以原本系统会做的动作,现在都需要在方法里面自己实现。
extension BasicController : UIViewControllerAnimatedTransitioning{
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.5
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
//获取弹出的View .from 消失的View .to 弹出的View
let presentView = (transitionContext.view(forKey: .to))!
//将弹出的View添加到ContainerView中
transitionContext.containerView.addSubview(presentView)
presentView.transform = CGAffineTransform.init(translatio