iOS默认的push动画是把即将展示的控制器从右边推过来。有时我们想实现类似PPT中的一些动画,这时候就需要自定义转场动画了。如下图我们想实现一个淡出并且放大的过场动画,在退出时是一个淡出缩小的动画。
首先需要自定义一个类DiaryAnimator.swift遵守 UIViewControllerAnimatedTransitioning 协议,然后实现它,代码如下:
import UIKitclass DiaryAnimator: NSObject, UIViewControllerAnimatedTransitioning {// 用于接受外界的operationvar operation:UINavigationControllerOperation!// 返回动画时间func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {return 0.4}// 要设置的动画//UIKit calls this method when presenting or dismissing a view controller. Use this method to configure the animations associated with your custom transition. You can use view-based animations or Core Animation to configure your animations.func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {let containerview = transitionContext.containerViewlet fromVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)let fromView = fromVC!.viewlet toVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)let toView = toVC?.view// 设置新场景透明度toView?.alpha = 0.0// 设置初始值if operation == UINavigationControllerOperation.pop {fromView?.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)}else{toView?.transform = CGAffineTransform(scaleX: 0.3, y: 0.3)}containerview.insertSubview(toView!, aboveSubview: fromView!)UIView.animate(withDuration: transitionDuration(using: transitionContext), delay: 0, options: UIViewAnimationOptions.curveEaseInOut, animations: {if self.operation == UINavigationControllerOperation.pop {// 放大要转出的场景fromView?.transform = CGAffineTransform(scaleX: 3.3,y: 3.3)} else {// 设置新场景为原始大小toView?.transform = CGAffineTransform(scaleX: 1.0,y: 1.0)}toView?.alpha = 1.0},completion: { finished intransitionContext.completeTransition(true)})}}
自定义好动画后,在要使用的控制器中实现 UINavigationControllerDelegate 协议的 optional func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? 方法,返回自定义的动画即可
extension HomeYearController : UINavigationControllerDelegate
{func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {let animate = DiaryAnimator()animate.operation = operationreturn animate}
}